如何以高性能方式显示具有自动调整单元格大小的大型UICollectionView?

时间:2019-02-05 17:26:53

标签: ios uicollectionview

我正在尝试显示一个UICollectionView,该显示能力能够显示用户的照片库,其中尊重照片的长宽比(受设备的宽度限制-请考虑instagram全宽度提要视图)。

我使用了UICollectionView Self Sizing Cells with Auto Layouthttps://medium.com/@wasinwiwongsak/uicollectionview-with-autosizing-cell-using-autolayout-in-ios-9-10-84ab5cdf35a2中的示例(文章中链接的回购中有一个PR,用于更新iOS 12 FYI项目)来设置一个带有变量的UICollectionView高度的单元格,但是当视图中有大量的单元格时,所有这些都超级笨拙/糟糕。

例如,此处的示例应用程序(修复了iOS 12):https://github.com/tttsunny/CollectionViewAutoSizingTest/pull/5在100个单元格下可以很好地工作,但是如果您尝试显示30,000,则该应用程序不可用-滚动时卡住了,并且没有响应。等待时间在UIViewController的估算大小逻辑中。

是否不建议对大型UICollectionView对象使用估计的大小?我该怎么做才能使单元格具有不同的高度值?

1 个答案:

答案 0 :(得分:0)

虽然我无法与所有大型集合视图对话,但是如果您在估计的大小计算中看到所有延迟,那么以不同的方式调整单元大小可能会很有帮助。由于在这种情况下您具有固定的宽度,并且只需要计算每个单元格的高度,就可以在主线程之外完成所有大小的计算,这有望避免滚动变得混乱和无响应。

实际上,对于图像的每个“页面”(我建议从20开始,但是您可以根据自己的情况对其进行调整),为每个图像计算所需的像元高度。通过查看UIImage imageSize在后​​台队列中执行此操作,并使用以下内容获取单元格高度:(imageSize.height / imageSize.width) * UIScreen.main.bounds.size.width。您需要将它们保留在内存中,可能最好与图像一起保存,然后您的sizeForItemAtIndexPath方法就可以为该单元格的大小索引到该数据结构中。然后,随着用户的滚动,在到达“下一页”之前,先计算“下一页”的大小(使用the collectionView prefetching API或仅挂接到UIScrollView代表。

您甚至可以直接在sizeForItemAtIndexPath中进行此计算,但是在后台计算事物将更加高效。不过,用这种方法直接进行计算可能是更容易的第一步: