具有自调整大小 insertRowsAtIndexPaths 的 UITableView 更改 contentOffset

Posted

技术标签:

【中文标题】具有自调整大小 insertRowsAtIndexPaths 的 UITableView 更改 contentOffset【英文标题】:UITableView with self-sizing insertRowsAtIndexPaths changes contentOffset 【发布时间】:2016-05-05 16:00:03 【问题描述】:

我尝试构建一个 talbleview,其中每一行都可以在点击时显示一个子列表。为此,我更新了 Datamodel 并调用了

[self.tableView insertRowsAtIndexPaths:addedIndexPaths withRowAnimation:(UITableViewRowAnimationTop)];

动画在行可见时发生。 添加的单元格在动画后正确显示,但在设置动画时,tableview 有时会向上滚动。这尤其发生在表格视图的最后一部分。此外,表格视图总是向上滚动,直到插入单元格上方的单元格顶部可见。

我想在可见动画期间修复 contentoffset。 我尝试在begin updatesend updates 内设置上下文偏移量,但这不起作用,因为动画会向上滚动,您会看到内容滚动回原位。

我使用自动布局来使单元格自动调整大小。

如何在插入可见单元格时保持tableview的内容偏移不变?

【问题讨论】:

当您指定 UITableViewRowAnimationTop 时,您要求表格视图滚动到添加单元格的顶部。如果您不希望这种情况发生,您需要选择一个新的行动画。你可能想要 UITableViewRowAnimationNone。您的所有选项都记录在此处developer.apple.com/library/ios/documentation/UIKit/Reference/…。 我不太确定,但是:可能是您正在使用 autoLayout,但您没有向 autoLayout 发送消息以在每个动画后自行调整。如果这是您做错的,请查看此视频。希望能帮助到你。 youtube.com/watch?v=N5Ert6LTruY @asma22 我确实使用自动布局来调整单元格的大小。我尝试并在开始/结束更新块内调用 self.tableview layoutIfNeeded 但它没有解决问题。您将如何通知自动布局? 我会按照你的建议去做 @Dare 我已经尝试过 UITableViewRowAnimationNone。我没工作 。在某些部分它工作得很好。但尤其是在表格视图的最后一部分附近开始跳跃 【参考方案1】:

我发现了这个问题。 自我调整大小是根本原因。

不要使用自动调整大小只需删除这些行:

tableView.estimatedRowHeight = 123

- (CGFloat)tableView:(UITableView *)tableView estimatedHeightForRowAtIndexPath:(NSIndexPath *)indexPath

【讨论】:

进行此更改后,您的单元格是否仍会自动调整大小? @Macondo2Seattle:我通过systemLayoutSizeFittingSize计算了单元格的高度。

以上是关于具有自调整大小 insertRowsAtIndexPaths 的 UITableView 更改 contentOffset的主要内容,如果未能解决你的问题,请参考以下文章

为啥自调整大小的表格视图单元格中的 UIImageView 具有内容模式 AspectFit 的原始高度?

UICollectionView 自定义布局动画故障,在 performBatchUpdates 上具有自我调整单元格大小

UICollectionView 具有自调整大小的单元格未正确计算 contentSize

UIImageView 在具有不同高度的自定义 UITableViewCell 内自动调整大小

具有自动调整大小的单元格的自定义 UICollectionViewLayout 会因估计的项目高度较大而中断

具有大小类的自调整 UITableViewCells 中的多行 UILabel - iOS 8 和 Swift