Objective c 将contentInset设置为UITableView也会设置行动画';子视图';框架

Objective c 将contentInset设置为UITableView也会设置行动画';子视图';框架,objective-c,uitableview,core-animation,Objective C,Uitableview,Core Animation,我有一个自定义单元格的UITableView。当然,在cellForRowAtIndexPath中,我尝试将一个旧的单元格出列并重用它。每个单元格都有一个自动调整大小视图的层次结构:我在cellForRowAtIndexPath中设置顶视图的内容时设置了顶视图的框架,其子视图相应地更改了它们的框架。请注意,行高度也是动态的。 当我只是滚动表格(包含不同内容和帧的行)时,一切都很好。但是我在这个表的同一视图中也有一个文本字段,所以我需要滚动表的内容来补偿显示/隐藏的键盘。我为以下内容设置conte

我有一个自定义单元格的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是一个很小的值以保持边距)时,table会重新加载单元格,这些单元格将从上方滚动显示。问题是,这种重新加载也是在动画块内部完成的!因此,当我在cellForRowAtIndexPath(称为部分或重新加载)中更改出列的子视图帧(特别是宽度)时,此更改也会设置动画,并且在单元格向下滚动到视图时可见。
我能避免这种行为吗?

我终于找到了解决方案:帧设置代码可以像这样从动画中排除:

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


在这里找到答案:

通过将
clipstobunds
YES设置为
tableview
解决了此问题

tableView.clipsToBounds = YES:
如果仍然存在问题,请将
clipstobunds
也设置为
footerview

tableView.clipsToBounds = YES: