单独重新加载单元格时,UITableViewCell内容会闪烁

我有一个表视图链接到一个NSFetchedResultController (即加载数据,也跟踪更改数据绑定到FRC)

我没有在我的单元格中使用AutoLayout (由于在iOS 8中引入了巨大的性能下降)。 我正在手动布局单元格的内容(使用-(void)layoutSubviews )。 另外,根据内容计算行的高度,并正确地caching/无效。

如果任何与我的数据相关的条件发生变化,相关的单元格单独更新(使用整个-(void)controllerWillChangeContent:...通过-(void)controllerDidChangeContent:...实现的委托方法)行更新的animation是: UITableViewRowAnimationNone

这里的问题是,我的单元格具有透明的背景,我可以看到一些视觉噪声(很可能是实际的单元格被垂直拉伸,我不能肯定地说,因为他们真的是短暂的和短暂的) [self.tableView reloadRowsAtIndexPaths:...];

我已经尝试了很多东西无济于事!

以下是我尝试过的不起作用的东西:

  • 实现-(CGFloat)tableView:(UITableView *)tableView estimatedHeightForRowAtIndexPath:(NSIndexPath *)indexPath ,返回估计高度的准确值。
  • 设置self.tableView.rowHeight=UITableViewAutomaticDimension; ,帮助很多,但不解决它。
  • [self.tableView beginUpdates];禁用animation[self.tableView beginUpdates]; 并在[self.tableView endUpdates];后启用[self.tableView endUpdates];
  • -(void)tableView:(UITableView *)tableView didEndDisplayingCell:(UITableViewCell *)cell forRowAtIndexPath:(NSIndexPath *)indexPath

事情有一点帮助:

  • 使细胞不透明(即为细胞设置背景颜色)。 奇怪的是,文物似乎是在实际的细胞内容。

更多信息

  • 我的单元格的大部分内容都是来自AsyncDisplayKit (ASTextNode,ASImageNode)的节点,但是用它们的UIKitreplace它们并不能解决问题。
  • 我所有的视觉更新都发生在主线程上。 我总是确保这一点。
  • 这个问题并不是无处不在,而是经常存在。 如果有帮助,他们似乎发生更多的插入第二个单元格后。
  • logging方法-(void)layoutSubviews在我的单元格中显示,每次更新时,具有更新条件的单元格将连续重新加载3次,而其他单元格只会更新一次。 我不强制任何[cell layoutIfNeeded];[cell setNeedsLayout]; 任何地方。
  • 使用[self.tableView reloadData];重新加载整个表视图[self.tableView reloadData]; 对我来说不是一个select。

附加更多信息

  • 使细胞不透明导致细胞摆脱一次! 奇怪的!

最后,对不起,我不能分享任何实际的代码,因为它不是一个testing项目,实现的复杂性使得任何代码共享都是徒劳的,除非被理解为一个整体。

谢谢你的时间。

在使用reloadRowsAtIndexPath的同时,我也面临着闪烁UITableViewCell的问题,所以我做了 –

  [UIView setAnimationsEnabled:NO]; [self.tableView beginUpdates]; [self.tableView reloadRowsAtIndexPaths:[NSArray arrayWithObjects:indexPath, nil] withRowAnimation:UITableViewRowAnimationNone]; [self.tableView endUpdates]; [UIView setAnimationsEnabled:YES]; 

上面的代码片段在重新加载单元格的时候没有单元格的animation。

如果有人遇到同样的问题:

如果您正在计算您的单元格高度及其元素,并且您依赖于NSIndexPath来查询任何数据或条件,请始终检查您的索引path是否有效(而不是nil )。 大多数返回索引path的UITableView方法(例如-(NSIndexPath *)indexPathForCell:..等等)可能会返回nil值,并将向下调整视图的螺旋。

在我的情况下,我有一个方法来确定我的单元格是否应该有一个标题,为此我检查了它是第一个单元格还是自上一个单元格以来发生了变化。 问题是indexPath.row == 0是真的,即使索引path实际上是nil (这是Objective-C中的nil的概念性问题,其中nil为0)。 所以短暂的一刻,我的细胞会认为它有一个头!

我觉得有点愚蠢,不检查nil索引path,但我认为分享它可能有助于某个人。

在迅速使用这个,它减less了闪烁

 let visibleIndexs = self.ContentTableview.indexPathsForVisibleRows! as NSArray print(visibleIndexs) for indx in visibleIndexs { if self.imgDownloadedIndexs!.containsObject(indx) { UIView.setAnimationsEnabled(false) self.ContentTableview.beginUpdates() self.ContentTableview.reloadRowsAtIndexPaths([indx as! NSIndexPath], withRowAnimation:.None) self.ContentTableview.endUpdates() UIView.setAnimationsEnabled(true) self.imgDownloadedIndexs?.removeObject(indx) }