将contentInset动画到UITableView也可以设置行的子视图帧的动画

时间:2012-03-16 19:18:03

标签: objective-c uitableview core-animation

我有一个带自定义单元格的UITableView。当然,在cellForRowAtIndexPath中,我尝试将旧单元出列并重新使用它。每个单元格都有一个自动调整视图的层次结构:当我在cellForRowAtIndexPath中设置其内容时,我设置了顶视图的框架,并且其子视图相应地更改了它们的框架。请注意,行高也是动态的。 当我只滚动表格(包含不同内容和帧的行)时,这一切都很好。但是我在该表的同一视图中也有一个文本字段,所以我需要滚动表的内容来补偿显示/隐藏的键盘。我为它设置了contentInset属性的动画:

// Called when the UIKeyboardWillHideNotification is sent
- (void)keyboardWillBeHidden:(NSNotification*)aNotification
{
    NSTimeInterval animationDuration = [[aNotification.userInfo objectForKey:UIKeyboardAnimationDurationUserInfoKey] floatValue];
    UIViewAnimationCurve animationCurve = [[aNotification.userInfo objectForKey:UIKeyboardAnimationCurveUserInfoKey] intValue];

    [UIView setAnimationCurve:animationCurve];
    [UIView animateWithDuration:animationDuration animations:^{
        messagesTable.contentInset = UIEdgeInsetsMake(0, 0, kHSTableBottomInset, 0);
        messagesTable.scrollIndicatorInsets = UIEdgeInsetsZero;
    }];
}

它也运行良好,但是有一个有趣的故障:当键盘被隐藏并且contentInset被动画恢复正常(kHSTableBottomInset是一个保持边距的小值)时,表重新加载将从上面滚动以显示的单元格。问题是这个重新加载也是在动画块中完成的!因此,当我在cellForRowAtIndexPath(被称为部件或重新加载)中更改出列的子视图帧(具体地,宽度)时,此更改也会被动画化,并且当单元格向下滚动以查看时,它也是可见的。 我可以避免这种行为吗?

2 个答案:

答案 0 :(得分:4)

我终于找到了解决方案:可以从动画中排除帧设置代码,如下所示:

[CATransaction begin];
[CATransaction setDisableActions:YES];
mainDataView.frame = rect;
[CATransaction commit];

[UIView setAnimationsEnabled:NO];
mainDataView.frame = rect;
[UIView setAnimationsEnabled:YES];

在这里找到答案:How can I exclude a piece of code inside a core animation block from being animated?

答案 1 :(得分:-1)

通过将clipsToBounds YES 设置为tableview来解决此问题。

tableView.clipsToBounds = YES:

如果您仍然遇到问题,请将clipsToBounds设置为footerview