流式布局
将估计大小设置为除none 之外的任何值会导致默认流布局不为我调用预取方法。这是一个示例回调:
func collectionView(_ collectionView: UICollectionView, prefetchItemsAt indexPaths: [IndexPath]) {
print(indexPaths.map { $0.row })
}
注意在这里设置这个,实际上是在隐式创建的流布局上设置的,而不是实际的UICollectionView:
这可以使用 Apple 的示例代码进行验证,将其更改为 none 以外的任何内容会导致它不调用委托。
https://developer.apple.com/documentation/uikit/uicollectionviewdatasourceprefetching/prefetching_collection_view_data
组合布局
另一方面,它也可以与组合布局一起使用,因为它们没有 estimatedSize 属性,就像在 IB 中自动创建的默认流布局一样。如果您创建组合布局,它将替换默认的流布局,因此如果您设置组合布局,则在 IB 中设置该属性将不起作用。
组合布局示例:
func createCompositionalLayout() -> UICollectionViewLayout {
let itemSize = NSCollectionLayoutSize(
widthDimension: .fractionalWidth(1.0),
heightDimension: .fractionalHeight(1.0)
)
let item = NSCollectionLayoutItem(layoutSize: itemSize)
let groupSize = NSCollectionLayoutSize(
widthDimension: .fractionalWidth(1.0),
heightDimension: .fractionalWidth(1/5)
)
let group = NSCollectionLayoutGroup.horizontal(
layoutSize: groupSize,
subitem: item,
count: 1
)
let section = NSCollectionLayoutSection(group: group)
return UICollectionViewCompositionalLayout(section: section)
}
然后这样设置:
collectionView.collectionViewLayout = createCompositionalLayout()
在viewDidLoad 委托中。
这样做确实允许调用prefetchItemsAt 方法。
还发现,如果在组合布局上估计单元格高度,则它不起作用。这很糟糕。
UICollectionView: compositional layout disables prefetching?
似乎如果您的任何 layoutSize 对象具有估计尺寸,它就会在预取时退出。
let size = NSCollectionLayoutSize(widthDimension: .estimated(104),
heightDimension: .estimated(128))
return NSCollectionLayoutItem(layoutSize: size)