iPhone:在动画导航栏的显示/隐藏时无法同时动画contentInset

3
在我的应用中,我有一个表格视图。当用户点击按钮时,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个回答

3
我找到了一个解决方法,但并不是最理想的。我等待插入完成动画后再显示导航栏。我仍然想知道是否可能进行并发动画。另外,我想知道是否可以反过来做(在导航栏完成动画后调用插入动画)。
这是我的修复代码:
这是在表视图控制器中:
- (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];
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接