UICollectionView 的 prefetchItemsAt 未被调用

Lin*_*rth 5 uicollectionview swift

UICollectionView我正在尝试为我使用的协议实现数据预取UICollectionViewDataSourcePrefetching;但是,相应的方法没有被调用。
集合视图具有自定义布局。我也尝试过常规的流程布局,结果相同。
重新加载数据后,我执行以下代码以使集合视图具有其内容的大小,以防止在该集合视图内滚动但在集合视图外部的滚动视图中滚动:

func reloadData() {
    viewDidLayoutSubviews()
    collectionView.reloadData()
    collectionView.layoutIfNeeded()
    viewDidLayoutSubviews()
}

override func viewDidLayoutSubviews() {
    super.viewDidLayoutSubviews()

    collectionViewHeightConstraint.constant = collectionView.collectionViewLayout.collectionViewContentSize.height
    collectionView.layoutIfNeeded()
    view.layoutIfNeeded()
}
Run Code Online (Sandbox Code Playgroud)

也许这有什么关系?

我做了什么:

  • 我的UIViewController 继承UICollectionViewDataSourcePrefetching
  • collectionView.prefetchDataSource = self(也尝试使用故事板)
  • collectionView.isPrefetchingEnabled = true(也尝试使用故事板)
  • 我已经实施了collectionView(_:prefetchItemsAt:)

问题:

prefetchItemsAt方法未被调用。我通过print在方法中放置一条语句并设置断点来确定这一点。

Fog*_*ter 1

我执行以下代码以使集合视图具有其内容的大小,以防止在该集合视图内滚动,但在集合视图外部的滚动视图中滚动:

这听起来很破碎。

你为什么做这个?

当用户滚动集合视图时,会触发集合视图上的预取(来自文档)。通过使集合视图框架与内容大小相同,您实际上会禁用集合视图本身的滚动。

当用户滚动时,集合视图调用此方法

如果您强制集合视图框架与内容大小相同,那么您就完全破坏了UICollectionView

未调用预取的原因是因为每个单元格都已加载。预取中不再有任何内容。因为您的集合视图同时显示每个单元格。

如果您想滚动集合视图...让集合视图处理它。您不需要将集合视图放置在另一个滚动视图中。