相关疑难解决方法(0)

UICollectionView:组合布局禁用预取?

我有一个非常简单的方法UICollectionView,它使用组合布局来轻松实现动态单元格高度。不幸的是,这样做似乎禁用了使用UICollectionViewDataSourcePrefetching. 在以下示例代码中,该collectionView(_:prefetchItemsAt:)方法仅在初始显示集合视图时调用一次。没有滚动操作会导致对方法的进一步调用。

我该怎么做才能使预取工作?

class ViewController: UIViewController, 
    UICollectionViewDataSource,
    UICollectionViewDelegate,
    UICollectionViewDataSourcePrefetching
{
    @IBOutlet var collectionView: UICollectionView!

    override func viewDidLoad() {
        super.viewDidLoad()

        collectionView.collectionViewLayout = createLayout()
        collectionView.dataSource = self
        collectionView.delegate = self
        collectionView.prefetchDataSource = self
        collectionView.register(MyCell.self, forCellWithReuseIdentifier: "cell")
    }

    func collectionView(_ collectionView: UICollectionView, numberOfItemsInSection section: Int) -> Int {
        return 100
    }

    func collectionView(_ collectionView: UICollectionView, cellForItemAt indexPath: IndexPath) -> UICollectionViewCell {
        let cell = collectionView.dequeueReusableCell(withReuseIdentifier: "cell", for: indexPath) as! MyCell
        cell.label.text = String(repeating: "\(indexPath) ", count: indexPath.item) …
Run Code Online (Sandbox Code Playgroud)

prefetch ios uicollectionview swift

9
推荐指数
1
解决办法
995
查看次数

在 UICollectionViewFlowLayout 上设置estimatedItemSize 会破坏UICollectionViewDataSourcePrefetching 吗?

我正在创建一个UICollectionView具有动态高度的单元格并使用estimatedItemSize属性UICollectionViewFlowLayoutApple Docs Reference)。

虽然,我注意到一旦我设置了estimatedItemSize属性,我prefetchItemsAtUICollectionViewDataSourcePrefetching委托方法就不会被调用。

func collectionView(_ collectionView: UICollectionView, prefetchItemsAt indexPaths: [IndexPath])

如果我没有设置estimatedItemSize,预取将再次开始工作。这是已知的行为还是我在这里做错了什么?请帮忙。

示例代码:

class CollectionViewController: UICollectionViewController {

var layout: UICollectionViewFlowLayout = {
    let layout = UICollectionViewFlowLayout()
    let width = UIScreen.main.bounds.size.width
    layout.estimatedItemSize = CGSize(width: width, height: 100)
    return layout
}()

override func viewDidLoad() {
    super.viewDidLoad()
    if #available(iOS 10.0, *) {
        collectionView?.prefetchDataSource = self
    }

    collectionView.collectionViewLayout = layout

    // Register cell classes
    self.collectionView.register(UINib.init(nibName: "CollectionViewCell", bundle: nil), forCellWithReuseIdentifier: reuseIdentifier) …
Run Code Online (Sandbox Code Playgroud)

uikit ios uicollectionview swift uicollectionviewflowlayout

5
推荐指数
0
解决办法
228
查看次数