Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/image-processing/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ios 如何使用自动调整单元格大小的方式显示大型UICollectionView?_Ios_Uicollectionview - Fatal编程技术网

Ios 如何使用自动调整单元格大小的方式显示大型UICollectionView?

Ios 如何使用自动调整单元格大小的方式显示大型UICollectionView?,ios,uicollectionview,Ios,Uicollectionview,我正在尝试显示一个UICollectionView,它能够显示用户的照片库,其中照片纵横比得到了尊重(受设备宽度的限制-想想instagram全宽提要视图) 我使用了和中的示例(文章中链接的回购协议中有一个PR,用于更新iOS 12 FYI的项目)来设置具有可变高度单元格的UICollectionView,但当视图中有大量单元格时,所有这些都是超级滞后/可怕的 例如,这里的示例应用程序(使用iOS 12修复程序):适用于100个单元格,但如果您尝试显示30000个单元格,则该应用程序无法使用-它

我正在尝试显示一个
UICollectionView
,它能够显示用户的照片库,其中照片纵横比得到了尊重(受设备宽度的限制-想想instagram全宽提要视图)

我使用了和中的示例(文章中链接的回购协议中有一个PR,用于更新iOS 12 FYI的项目)来设置具有可变高度单元格的
UICollectionView
,但当视图中有大量单元格时,所有这些都是超级滞后/可怕的

例如,这里的示例应用程序(使用iOS 12修复程序):适用于100个单元格,但如果您尝试显示30000个单元格,则该应用程序无法使用-它无法滚动,并且没有响应。延迟在
UIViewController
的估计大小逻辑中


对于大尺寸
UICollectionView
对象,是否不建议使用估计尺寸?那么,我该怎么做才能使单元格具有不同的高度值呢?

虽然我不能对所有大型集合视图说话,但如果您在估计的大小计算中看到了所有的延迟,那么以不同的方式调整单元格的大小可能会有很大帮助。因为在这个场景中,您有一个固定的宽度,只需要计算每个单元格的高度,您就可以在主线程之外完成所有的大小计算,这将有望阻止您的滚动变得很慢和无响应

更实际地说,对于每个“页面”的图像(我建议从20开始,但您可以根据其在您的情况下的工作方式进行调整),计算每个图像所需的单元格高度。在后台队列中执行此操作,方法是查看
UIImage
imageSize
,并使用以下命令获取单元格高度:
(imageSize.height/imageSize.width)*UIScreen.main.bounds.size.width
。您需要将它们保存在内存中,可能最好与图像本身一起保存,然后您的
sizeFormiteIndeXPath
方法可以根据单元格大小索引到该数据结构中。然后,当用户滚动时,在到达“下一页”之前计算“下一页”的大小(使用或只是挂接到
UIScrollView
代理)


您甚至可以直接在
sizeForItemAtIndexPath
中进行此计算,但在后台进行计算会更加高效。不过,直接使用此方法进行计算可能是更简单的第一步:)。

虽然我不能对所有大型集合视图进行讨论,如果您在估计的大小计算中看到了所有的延迟,那么以不同的方式调整单元格大小可能会有很大帮助。因为在这个场景中,您有一个固定的宽度,只需要计算每个单元格的高度,您就可以在主线程之外完成所有的大小计算,这将有望阻止您的滚动变得很慢和无响应

更实际地说,对于每个“页面”的图像(我建议从20开始,但您可以根据其在您的情况下的工作方式进行调整),计算每个图像所需的单元格高度。在后台队列中执行此操作,方法是查看
UIImage
imageSize
,并使用以下命令获取单元格高度:
(imageSize.height/imageSize.width)*UIScreen.main.bounds.size.width
。您需要将它们保存在内存中,可能最好与图像本身一起保存,然后您的
sizeFormiteIndeXPath
方法可以根据单元格大小索引到该数据结构中。然后,当用户滚动时,在到达“下一页”之前计算“下一页”的大小(使用或只是挂接到
UIScrollView
代理)

您甚至可以直接在
sizeForItemAtIndexPath
中进行此计算,但在后台进行计算会更加高效。不过,使用此方法直接计算可能是更简单的第一步:)