预先创建 UICollectionView 单元格 - 布局问题

Posted

技术标签:

【中文标题】预先创建 UICollectionView 单元格 - 布局问题【英文标题】:Pre-creating UICollectionView cells - layout issue 【发布时间】:2014-02-10 15:06:53 【问题描述】:

我有一个有 6 行的 UITableView。每行包含一个UICollectionView。每个集合视图都包含一个包含 10-15 个单元格的部分。一个视图控制器是表视图和集合视图的数据源和委托。

我想解决滚动表格视图时的一些性能问题。每当一个新部分出现时,在创建和填充集合视图时都会有一个小暂停。由于我有固定数量的单元格 (几乎是静态的(它们最初是从 Web API 加载的,但数据每周只会更改几次),我想预先构建每个集合视图单元。我希望用户在启动时多等待半秒,而不是遇到生涩的滚动。

为此,我更新了我的collectionView: cellForItemAtIndexPath: 以检查我正在维护的单元格字典。它查找由集合视图索引和单元格的 indexPath 组合而成的键。如果key存在,则返回对应的对象。如果没有找到,则构建单元格并将其添加到字典中。此步骤有效地防止单元被卸载和回收,但代价是使用更多内存。

但在启动时,我仍然需要为每个单元格运行一次以预填充字典。我遍历每个表格视图单元格,找到集合视图,然后调用

[self collectionView:collectionView cellForItemAtIndexPath:indexPath];

这就够了。正在创建单元格并将其存储在字典中,当我滚动到新的集合视图时,我看到它们正在从字典中拉出并显示出来。但是所有单元格及其所有内容都被推到了左上角 0,0 处。

一些日志记录告诉我,在创建单元格时,集合视图的框架是 0, 0, 0, 0。我想这就是为什么我的布局都没有被应用?

我该如何解决这个问题?

(也对我的预加载实现中的任何通用 cmets 感兴趣)。

【问题讨论】:

【参考方案1】:

我通过在 UITableViewCell 上调用 [cell layoutIfNeeded] 解决了这个问题(不是集合视图)。欢迎提供更详尽的解释。

【讨论】:

以上是关于预先创建 UICollectionView 单元格 - 布局问题的主要内容,如果未能解决你的问题,请参考以下文章

预加载下一个(当前不可见)单元格 UICollectionView

如何使用 2 个或更多自定义单元格创建自定义 UICollectionView?

旋转后 UICollectionView 单元格不水平

UICollectionView 将在调用“reloadItems”方法时重新创建单元格

UICollectionView中删除一个单元格后刷新单元格布局

如何在 iOS 中动态更改 UICollectionView 单元格高度