UICollectionView初始加载时prefetchItemsAtIndexPaths未触发初始预取怎么办?
问题:UICollectionView初始加载时未触发预取方法
我正在尝试实现一个类似Instagram Stories的全屏水平分页UICollectionView,代码如下:
override func viewDidLoad() { super.viewDidLoad() let layout = UICollectionViewFlowLayout() layout.scrollDirection = .horizontal // Note: I set the frame for the collection view self.view.bounds later let collectionView = UICollectionView(frame: .zero, collectionViewLayout: layout) collectionView.isPagingEnabled = true collectionView.prefetchDataSource = self // ... other collection view configuration self.view.addSubview(collectionView) ... } func collectionView(_ collectionView: UICollectionView, prefetchItemsAt indexPaths: [IndexPath]) { print(indexPaths) }
这段代码在首次滚动后的所有后续“页面”中运行正常,但在第一个单元格初始加载时并未调用预取方法。
实际输出为:
[[2, 0]] [[3, 0]] [[4, 0]] [[5, 0]]
而我期望的输出是:
[[1, 0]] [[2, 0]] [[3, 0]] [[4, 0]] [[5, 0]]
请问有没有办法触发这次初始预取?
解决方案
方法1:手动触发初始预取
在collectionView完成布局和数据源设置后,手动调用预取方法指定初始要预取的索引路径。可以放在viewDidAppear中执行,避免布局未完成的问题:
override func viewDidAppear(_ animated: Bool) { super.viewDidAppear(animated) // 预取索引为1的单元格,对应你期望的初始预取项 collectionView.prefetchItems(at: [IndexPath(item: 1, section: 0)]) }
方法2:确保CollectionView布局计算准确
系统的自动预取依赖于准确的布局计算,你提到后续才设置collectionView的frame为self.view.bounds,可以提前在初始化时设置正确的frame,或者设置后强制刷新布局,让系统能正确识别需要预取的内容:
// 初始化时直接设置正确的frame let collectionView = UICollectionView(frame: self.view.bounds, collectionViewLayout: layout) // 或者在设置frame后调用layoutIfNeeded collectionView.frame = self.view.bounds collectionView.layoutIfNeeded()
方法3:在布局完成后触发预取
利用viewDidLayoutSubviews回调,确认第一个单元格已显示后,手动触发下一个单元格的预取,同时注意避免重复调用:
private var didTriggerInitialPrefetch = false override func viewDidLayoutSubviews() { super.viewDidLayoutSubviews() guard !didTriggerInitialPrefetch, let firstVisibleIndex = collectionView.indexPathsForVisibleItems.first?.item, firstVisibleIndex + 1 < yourDataSourceCount else { return } let prefetchIndexPath = IndexPath(item: firstVisibleIndex + 1, section: 0) collectionView.prefetchItems(at: [prefetchIndexPath]) didTriggerInitialPrefetch = true }
内容的提问来源于stack exchange,提问作者No No
相关产品推荐
相关产品推荐

