动画 contentInset 到 UITableView 也动画行的子视图的框架

Posted

技术标签:

【中文标题】动画 contentInset 到 UITableView 也动画行的子视图的框架【英文标题】:Animating contentInset to UITableView also animates rows' subviews' frames 【发布时间】:2012-03-16 19:18:02 【问题描述】:

我有一个带有自定义单元格的 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 (称为部件或重新加载)中更改出队的子视图框架(特别是宽度)时,此更改也会进行动画处理,并且在单元格向下滚动以查看时可见。 我可以避免这种行为吗?

【问题讨论】:

【参考方案1】:

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

[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?

【讨论】:

【参考方案2】:

通过将clipsToBounds YES 设置为tableview 解决了这个问题。

tableView.clipsToBounds = YES:

如果您仍有问题,请将 clipsToBounds 也设置为 footerview

【讨论】:

以上是关于动画 contentInset 到 UITableView 也动画行的子视图的框架的主要内容,如果未能解决你的问题,请参考以下文章

动画 UICollectionView contentInset 调整

UITableView contentInset 的动画不一致

在 popViewController 之后 ContentInset 自动改变

如何在 SwiftUI 中设置 ScrollView 的 contentInset

将子视图添加到 UITable

当我使用 contentInset 时,我不完全理解 scrollRectToVisible