我有一个链接到一个表视图NSFetchedResultController
(即加载数据并跟踪对数据的更改绑定到 FRC)
我没有AutoLayout
在我的单元格中使用(由于它在 iOS 8 中引入了巨大的性能下降)。我在单元格中手动布置单元格的内容(使用-(void)layoutSubviews
)。另外,行的高度是根据内容计算的,并被正确缓存/失效。
如果与我的数据相关的任何条件发生变化,相关的单元格会单独更新(-(void)controllerWillChangeContent:...
通过-(void)controllerDidChangeContent:...
委托方法实现的整体)行更新的动画是:UITableViewRowAnimationNone
这里的问题是,我的单元格具有透明背景,并且在[self.tableView reloadRowsAtIndexPaths:...];
.
我尝试了很多东西都无济于事!
以下是我尝试过但不起作用的事情:
- 实施
-(CGFloat)tableView:(UITableView *)tableView estimatedHeightForRowAtIndexPath:(NSIndexPath *)indexPath
,返回估计高度的准确值。 - 设置
self.tableView.rowHeight=UITableViewAutomaticDimension;
,有很大帮助,但不能解决它。 - 禁用动画后
[self.tableView beginUpdates];
启用[self.tableView endUpdates];
- 从单元格内容中删除所有子视图
-(void)tableView:(UITableView *)tableView didEndDisplayingCell:(UITableViewCell *)cell forRowAtIndexPath:(NSIndexPath *)indexPath
有一点帮助的事情:
- 使单元格不透明(即为单元格设置背景颜色)。奇怪的是,工件似乎在实际的单元格内容之下。
更多信息
- 我的大部分单元格内容都是来自AsyncDisplayKit(ASTextNode、ASImageNode)的节点,但是用它们的
UIKit
对应项替换它们并不能解决问题。 - 我所有的视觉更新都发生在主线程上。我总是确保这一点。
- 这个问题并不普遍,但经常存在。如果有帮助,它们似乎在插入第二个细胞后发生得更多。
- 在我的单元格中记录该方法
-(void)layoutSubviews
表明,具有更新条件的单元格在每次更新时连续重新加载 3 次,而其他单元格只更新一次。我不会强迫任何[cell layoutIfNeeded];
或[cell setNeedsLayout];
任何地方。 - 使用重新加载整个表格视图
[self.tableView reloadData];
对我来说不是一个选项。
其他更多信息
- 使单元格不透明会导致单元格只布置一次!奇怪的!
最后,很抱歉我不能分享任何实际的代码,因为它不是一个测试项目,并且实现的复杂性使得任何代码共享都是徒劳的,除非作为一个整体来理解。
谢谢你的时间。