iPhone:在为导航栏显示/隐藏设置动画时无法为 contentInset 设置动画

Posted

技术标签:

【中文标题】iPhone:在为导航栏显示/隐藏设置动画时无法为 contentInset 设置动画【英文标题】:iPhone: Can't animate contentInset while animating Nav Bar show/hide 【发布时间】:2010-06-07 04:40:14 【问题描述】:

在我的应用程序中,我有一个表格视图。当用户单击按钮时,UIView 会覆盖该表视图的一部分。它本质上是一个部分模态。在该模式处于活动状态时,该表视图仍可有意滚动。为了允许用户滚动到表格视图的底部,我更改了 contentInset 和 scrollIndicatorInsets 值以调整模式上方的较小区域。当模态被拿走时,我会重置那些插入值。

问题是当用户滚动到新调整的插图的底部然后关闭模式时,表格视图会突然跳转到新的滚动位置,因为插图会立即更改。我想为它制作动画,以便有一个过渡,但 beginAnimation/commitAnimations 方法由于某种原因没有影响它。

编辑:更多信息。我发现了冲突。在呈现模式时,我还隐藏了导航栏。导航栏在显示和隐藏时会原生地向上和向下设置表格视图的动画。当我停止为导航栏设置动画时,插入动画效果很好。有谁知道我可以做些什么来解决这个冲突?是否必须等待导航栏动画完成才能调整插图?如果是这样,我如何挂钩?

非常感谢任何帮助!

表格视图控制器的相关代码在这里:

- (void)viewDidLoad 
    [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(modalOpened) name:@"ModalStartedOpening" object:nil];
    [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(modalDismissed) name:@"ModalStartedClosing" object:nil];
    [super viewDidLoad];


- (void)modalOpened 
    [UIView beginAnimations:nil context:NULL];
    [UIView setAnimationDuration:0.5];
    [UIView setAnimationDelegate:self];
    self.tableView.contentInset = UIEdgeInsetsMake(0, 0, 201, 0);
    self.tableView.scrollIndicatorInsets = UIEdgeInsetsMake(0, 0, 201, 0);
    [UIView commitAnimations];


- (void)modalDismissed 
    [UIView beginAnimations:nil context:NULL];
    [UIView setAnimationDuration:0.5];
    [UIView setAnimationDelegate:self];
    self.tableView.contentInset = UIEdgeInsetsMake(0, 0, 0, 0);
    self.tableView.scrollIndicatorInsets = UIEdgeInsetsMake(0, 0, 0, 0);
    [UIView commitAnimations];

【问题讨论】:

【参考方案1】:

我找到了解决方法,但并不理想。插图完成动画后,我等待显示导航栏。我仍然很好奇并发动画是否可能。另外我想知道是否有可能做相反的事情。 (在导航栏完成动画后调用插入动画)

这是我的修复代码:

这是在表视图控制器中:

- (void)modalDismissed 
    [UIView beginAnimations:nil context:NULL];
    [UIView setAnimationDuration:0.3];
    [UIView setAnimationDelegate:self];
    [UIView setAnimationDidStopSelector:@selector(modalDismissedEnded:finished:context:)];
    self.tableView.contentInset = UIEdgeInsetsMake(0, 0, 0, 0);
    self.tableView.scrollIndicatorInsets = UIEdgeInsetsMake(0, 0, 0, 0);
    [UIView commitAnimations];


- (void)modalDismissedEnded:(NSString *)animationID finished:(NSNumber *)finished context:(void *)context 
    [[NSNotificationCenter defaultCenter] postNotificationName:@"InsetFinishedAnimating" object:nil];

然后在导航控制器中:

- (void)viewDidLoad 
    [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(modalDismissed) name:@"InsetFinishedAnimating" object:nil];
    [super viewDidLoad];


- (void)modalDismissed 
    [self setNavigationBarHidden:NO animated:YES];

【讨论】:

以上是关于iPhone:在为导航栏显示/隐藏设置动画时无法为 contentInset 设置动画的主要内容,如果未能解决你的问题,请参考以下文章

导航栏显示/隐藏

启动时无法隐藏状态栏

启动时无法隐藏状态栏

导航栏隐藏在 iPhone sdk 的弹出视图控制器上

在 iPhone X 上,分别控制显示/隐藏导航栏和状态栏

iPhone仅在第一页隐藏导航栏