为什么在开始时为所有单元格调用索引路径上的UICollectionView的cellForItem

时间:2017-10-12 15:56:18

标签: ios swift uitableview uicollectionview uicollectionviewcell

为什么UICollectionView的索引路径上的cellForItem会在显示之前调用所有单元格。 collectionView不应该只获得它需要的单元格。像桌面视图一样显示在屏幕上的单元格会不会?

步骤

  • 使用ViewController的Storyboard。 ViewController有CollectionView。 CollectionView具有垂直流布局。

  • ViewController为collectionView提供了IBOutlet,并实现了collectionView的数据源和委托方法

  • 在数据源和委托方法中,单元格(对其大小使用自动布局)将传递到索引路径中项目的集合视图..单元格

在传递单元格之前放置一个print语句,表明在收集视图显示在屏幕上之前请求所有单元格。

import UIKit

class ViewController: UIViewController {
    @IBOutlet weak var collectionView: UICollectionView!

    override func viewDidLoad() {
        super.viewDidLoad()

        var flowLayout=collectionView.collectionViewLayout as! UICollectionViewFlowLayout;
        flowLayout.estimatedItemSize = CGSize(width:20,height:30);
        self.collectionView.register(UINib(nibName:"ShortCell", bundle:nil), forCellWithReuseIdentifier: "ShortCell");
        self.collectionView.register(UINib(nibName:"LongCell", bundle:nil), forCellWithReuseIdentifier: "LongCell");
    }
}

extension ViewController:UICollectionViewDelegate,UICollectionViewDataSource{
    func collectionView(_ collectionView: UICollectionView, numberOfItemsInSection section: Int) -> Int {
        return 500;
    }

    func collectionView(_ collectionView: UICollectionView, cellForItemAt indexPath: IndexPath) -> UICollectionViewCell {
        let row=indexPath.row;
        print("row:",indexPath.row);
        let rem = row % 2;
        if(rem==0){
            let cell = collectionView.dequeueReusableCell(withReuseIdentifier: "ShortCell", for: indexPath);
            return cell;
        }
        let cell = collectionView.dequeueReusableCell(withReuseIdentifier: "LongCell", for: indexPath);
        return cell;
    }
}

为什么collectionview需要在显示之前获取所有单元格?为什么它不像棋子那样以零散的方式请求单元格呢?这是一个问题吗?

1 个答案:

答案 0 :(得分:1)

经过一番调查......

使用flowLayout.estimatedItemSize时,自动布局会进行布局传递,以计算在估计尺寸 实际的细胞。

因此,如果您将.estimatedItemSize更改为实际估算的尺寸,则只应根据需要获得(约)cellForItemAt的调用次数。

请注意,不要高估大小。如果你这样做,你要么最终得到一大堆

  

未定义UICollectionViewFlowLayout的行为,因为:   项目宽度必须小于UICollectionView的宽度减去左边和右边的插入值,减去内容插入左右值。

错误消息,或者你得到傻瓜(不准确)大小的滚动指示器。