为什么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需要在显示之前获取所有单元格?为什么它不像棋子那样以零散的方式请求单元格呢?这是一个问题吗?
答案 0 :(得分:1)
经过一番调查......
使用flowLayout.estimatedItemSize
时,自动布局会进行布局传递,以计算在估计尺寸 实际的细胞。
因此,如果您将.estimatedItemSize
更改为实际估算的尺寸,则只应根据需要获得(约)cellForItemAt
的调用次数。
请注意,不要高估大小。如果你这样做,你要么最终得到一大堆
未定义UICollectionViewFlowLayout的行为,因为: 项目宽度必须小于UICollectionView的宽度减去左边和右边的插入值,减去内容插入左右值。
错误消息,或者你得到傻瓜(不准确)大小的滚动指示器。