我有一个表格视图,每个单元格都有可能有自己的高度,因此不适合使用rowHeight
。相反,现在我正在使用let indexSet = NSIndexSet(index: 10)
, and self.tableView.estimatedRowHeight = 75
。这意味着它调用sizeThatFits
对单元格起作用,以确定其高度。这一切都运作良好。
问题是当您重新加载屏幕上的单元格时。例如,向下滚动以显示单元格 10,然后重新加载单元格 10,效果很好。但是,当您开始向后滚动,经过您已经看到的单元格时,它会恢复为每个单元格的估计行高度,完全忽略sizeThatFits
,因此当您滚动时会跳跃。我不可能给出一个准确的或“足够好”的估计行高度,这样这种跳跃就不会被注意到,因为我的单元格将能够显示一行文本或完整图像 - 这是一个巨大的差异尺寸。
我在这里展示了这个效果:
https://vid.me/edgW https://vid.me/edgW
我对此进行了许多不同的尝试,混合使用 heightForRowAtIndexPath、estimatedHeightForRowAtIndexPath.. 等。我在 StackOverflow 上尝试了各种建议。似乎没什么作用。
我附上了一个非常简单的示例项目,您可以自己尝试一下:
https://www.dropbox.com/s/8f1rvkx9k23q6c1/tableviewtest.zip?dl=0 https://www.dropbox.com/s/8f1rvkx9k23q6c1/tableviewtest.zip?dl=0
- 运行项目。
- 滚动直到看到单元格 10。
- 等待最多 5 秒,让单元格重新加载(它变成紫色)。
- 向上滑动。
值得注意的是——这确实not如果重新加载时单元格不在视图中,则会发生这种情况。如果是以上任一情况or在当前滚动点以下,一切都按预期进行。
如果没有其他原因,这种行为似乎是一个错误,只是它在 iOS 9 上不再重现。我确信这并不能带来太多安慰。
正如 @NickCatib 所说,这个问题主要源于不准确的估计。在 iOS 8 上你能做的最好的事情就是改进估计。许多人推荐的一种技术是将高度缓存在willDisplayCell
并在后续调用中使用它们estimatedRowHeightAtIndexPath
.
您也许可以通过不做任何事情来减轻这种行为UITableView
丢弃其缓存,例如直接使用修改单元格中的内容cellForRowAtIndexPath
而不是在屏幕上使用重新加载。但是,如果您确实需要更改单元格的高度,这将无济于事。
恐怕不能在表视图中轻松修复该错误,因为您无法控制布局。在子类中可以更轻松地解决该错误UICollectionViewFlowLayout
通过改变contentOffsetAdjustment
在无效期间,尽管这可能不是很容易。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)