如何提高UICollectionView的性能?让它滚动流畅。

3

我正在开发一个iOS应用程序,使用UICollectionView来实现一个像普通日历应用程序一样的模块。日期单元格的背景颜色根据日期更改(这不重要)。单元格是使用dequeueReusableCellWithReuseIdentifier方法重用的。然而,当滚动它时,日历非常卡顿。我在Google和StackOverflow上搜索了整整一天,但没有找到完美的答案。


它在实际设备上还是模拟器上运行缓慢?对我来说,模拟器上由于某种原因表现非常糟糕,但在设备上滚动非常流畅。UICollectionView旨在重用其单元格,因此这本身就意味着良好的滚动性能。 - dariaa
3个回答

3
许多因素可能导致滚动性能缓慢。您可能需要缩小范围并发布一些代码。一些常见的错误包括:
  • 每次在单元格中加载数据时重新创建所有子视图。您应该为每个单元格实例创建子视图一次,并在 prepareForReuse 中清除它们的状态。
  • 重复使用单元格时删除并重新添加自动布局约束。如果您需要根据数据修改自动布局约束,则修改现有约束上的常量值比删除并重新添加约束要快得多。

1
首先要检查的是您的单元格是否被正确地重复使用。如果没有,当它们从xib实例化时,会有一个显著的开销(特别是对于复杂单元格)。
这样做的一种简单方法是在您的单元子类中实现-prepareForReuse方法,并记录一个消息。每次单元格滚动出屏幕时,您应该看到此方法被触发。如果没有触发,那么您的单元格没有被正确地重复使用。
一些人报告了类似的问题,可能是iOS 7中的一个错误。请参见这里这里这里

0
通常,确保所有单元格都不透明会有所帮助。在单元格的图层上将shouldRasterize设置为YES(不要忘记设置rasterizationScale)。
我还注意到NSDate操作可能非常缓慢。因此,如果您使用循环并每次增加一天来增加nsdate,您也可以通过仅从i = 1循环以<= numberOfDaysInTheMonth来提高性能。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接