UIViewController 在加载时为所有单元格调用 sizeForItemAtIndexPath

Posted

技术标签:

【中文标题】UIViewController 在加载时为所有单元格调用 sizeForItemAtIndexPath【英文标题】:UIViewController calls sizeForItemAtIndexPath for all cells on load 【发布时间】:2015-02-22 17:59:49 【问题描述】:

我有一个带有 UICollectionViewFlowLayout 的 UICollectionView。在使用大数据(5,000 多个单元格)进行测试时,我注意到加载时存在延迟。我发现在加载每个单元格时都会调用sizeForItemAtIndexPath。由于我正在执行类似应用程序的消息传递并且每个单元格的高度不同,这会导致发生高度估计。我没有滚动到底部或任何东西,只是加载视图。

我制作了一个小应用程序来演示我在说什么(查看控制台以查看它为所有单元格调用 sizeForItemAtIndexPath)https://github.com/ftheo/CollectionViewLoadingBug

任何帮助将不胜感激。谢谢

【问题讨论】:

【参考方案1】:

也许没有办法阻止调用 sizeForItemAtIndexPath 方法...

这是计算滚动内容视图大小的正常设计。

【讨论】:

【参考方案2】:

集合视图需要知道其内容的大小,因此它调用-sizeForItemAtIndexPath:。没有办法解决这个问题。

考虑改用UITableView。它提供了一种方法 -tableView:estimatedHeightForRowAtIndexPath: 粗略猜测屏幕外单元格。

【讨论】:

我不明白为什么-sizeForItemAtIndexPath: 被调用,即使你没有滚动并且你只是在顶部,但无论如何。我认为只有在调用 scrolling/willDisplayCell 时才会调用它。我会试试tableView。谢谢 想象你是集合视图。您必须知道内容的大小才能正确配置滚动视图(以便正确显示滚动条!)。你怎么知道它有多大?您必须向代表询问每个单元格 感谢克里斯蒂安,有道理。这就是为什么我猜想collectionview也会有一个估计的高度/宽度,而不仅仅是tableview。如果您有很多项目,滚动条将不准确 @ChristianSchnorr 为什么 UICollectionViewFlowLayout 像 UITableView 一样具有 estimatedItemSize 属性,但以另一种方式工作? :(

以上是关于UIViewController 在加载时为所有单元格调用 sizeForItemAtIndexPath的主要内容,如果未能解决你的问题,请参考以下文章

如何在使用数据表加载页面时为所有行和列动态添加复选框?

NSObject 用 nib 加载 UIView 但文件所有者是 UIViewController

UIViewController 没有响应 NSNotifications

$rootScope.currentUser 在刷新时为空

急切加载时为 Eloquent 关系别名

在按钮点击时为选定的行设置动画