ios - UICollectionView 是否提前为所有单元格调用“sizeForItem”?
问题描述
我正在制作一个无限滚动的代码,我遇到了这个问题,在加载之前UICollectionView
将调用sizeForItem
每个单元格。我不明白为什么它会这样做,因为在给定时间只显示一定的数字
public func collectionView(_ collectionView: UICollectionView, layout collectionViewLayout: UICollectionViewLayout, sizeForItemAt indexPath: IndexPath) -> CGSize {
print("sizeForItem\(Date())")
let height = collectionView.frame.height
guard tickerItems.count > 0 else {
return CGSize(width: 500, height: 250)
}
let tickerCell = collectionView.cellForItem(at: indexPath) as? TickerCell ?? TickerCell()
let tickerItem = tickerItems[indexPath.row % tickerItems.count]
let width = tickerCell.width(for: tickerItem)
return CGSize(width: width, height: height)
}
我想到了一些事情:也许我返回的宽度非常小?不,我检查了它们是正常的。是否启用了预取?不,我禁用它。
public func collectionView(_ collectionView: UICollectionView, numberOfItemsInSection section: Int) -> Int {
return tickerItems.count > 0 ? 100000 : 0
}
即使我禁用了控制自动滚动的计时器,我仍然遇到同样的问题。即使该索引长时间未显示,collectionView 也会计算每个索引的大小。即它会在最终解锁加载collectionView 的UI 之前计算100,000 个索引的大小。
解决方案
集合视图需要知道它将有多大,因此它需要获取所有单元格的大小。集合视图是滚动视图。它需要知道它的内容大小,它只能通过询问你所有单元格的大小来确定。
推荐阅读
- r - 带有插入符号的自定义模型(R6 类)给出绑定错误
- python - 在 slurm 上安排数组作业时使用 argparse?
- python - “自我”如何正确更新原始变量?N皇后问题中的递归/回溯(Python)
- python - 使用 librosa 隔离音频前景并转换回音频流
- opencv - 使用 Visual Studio 和 CMake 安装 OpenCV 时出现问题(错误代码:MSB3073)
- multithreading - IntelliJ Idea 中的多线程调试
- swift - 首次编译时 Swift 程序崩溃
- shopify - 如果购物车的任何物品有特定标签,则显示 HTML
- javascript - 具有位置的子 div:绝对不充当嵌套子项
- r - 如何在 Ubuntu 18.04.3 LTS(仿生海狸)上安装 Tidyverse?