gpt4 book ai didi

ios - 重新加载单元格后向上滚动时具有动态单元格高度的 UITableView 跳跃

转载 作者:IT王子 更新时间:2023-10-29 05:20:54 26 4
gpt4 key购买 nike

我有一个 TableView ,每个单元格都有自己的高度,因此不适合使用 rowHeight。相反,现在我正在使用 let indexSet = NSIndexSet(index: 10)self.tableView.estimatedRowHeight = 75。这意味着它调用单元格上的 sizeThatFits 函数来确定其高度。这一切都很好。

问题是当您重新加载屏幕上的单元格时。例如,向下滚动以显示单元格 10,然后重新加载单元格 10,效果很好。但是,当您开始向上滚动,越过您已经看到的单元格时,它会恢复为每个单元格的 estimatedRowHeight,完全忽略 sizeThatFits,因此在您滚动时会跳来跳去。我不可能给出准确或“足够好”的 estimatedRowHeight,这样这种跳跃就不会引人注意,因为我的单元格将能够显示一行文本或完整图像——这是一个很大的不同大小。

我在这里展示了这个效果:

https://vid.me/edgW

我对此做了很多不同的尝试,混合使用 heightForRowAtIndexPath、estimatedHeightForRowAtIndexPath 等。我在 StackOverflow 上尝试了各种建议。似乎没有任何效果。

我附上了一个非常简单的示例项目,您可以在其中亲自尝试:

https://www.dropbox.com/s/8f1rvkx9k23q6c1/tableviewtest.zip?dl=0

  1. 运行项目。
  2. 滚动直到出现单元格 10。
  3. 最多等待 5 秒,让单元格重新加载(变为紫色)。
  4. 向上滚动。

值得注意 - 如果单元格在重新加载时不在 View 中,这不会发生。如果它在当前滚动点上方 下方,一切都会按预期进行。

最佳答案

这种行为似乎是一个错误,如果没有其他原因,只是它在 iOS 9 上不再可重现。我敢肯定这不是什么安慰。

问题主要源于估计不准确,如@NickCatib 所说。在 iOS 8 上你能做的最好的事情就是改进估计。许多人推荐的技术是在 willDisplayCell 中缓存高度,并在随后调用 estimatedRowHeightAtIndexPath 时使用它们。

您可以通过不做任何事情让 UITableView 丢弃其缓存来减轻这种行为,例如通过直接使用 cellForRowAtIndexPath 而不是修改单元格中的内容如果它在屏幕上,则使用重新加载。但是,如果您确实需要更改单元格的高度,那将无济于事。

恐怕无法在表格 View 中轻松修复该错误,因为您无法控制布局。通过在失效期间更改 contentOffsetAdjustment,可以更轻松地在子类 UICollectionViewFlowLayout 中解决该错误,尽管这可能不是很容易。

关于ios - 重新加载单元格后向上滚动时具有动态单元格高度的 UITableView 跳跃,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32440874/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com