为什么索引路径上的UICollectionView的cellForItem在开始时被调用了所有单元格
为什么索引路径中的UICollectionView的cellForItem在显示之前被调用了所有单元。不应该collectionView只是得到它需要的单元格..e.e。像tableview一样会在屏幕上显示的单元格会是什么?为什么索引路径上的UICollectionView的cellForItem在开始时被调用了所有单元格
步骤
故事板与视图控制器。 ViewController具有CollectionView。 CollectionView具有垂直流布局。
的ViewController有IBOutlet中为的CollectionView和实现的CollectionView的数据源和委托方法
内的数据源和委托方法细胞(即使用自动版式的大小)传递到的CollectionView ..小区在索引路径下的项目
在传递单元格之前放置print语句,显示在屏幕上显示collectionview之前请求所有单元格。
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需要在显示之前获取所有单元格?为什么它不仅仅像tableview那样以零碎的方式请求单元格?这是一个问题吗?
有点调查后...
当使用flowLayout.estimatedItemSize
,自动布局,使布局传递来计算许多细胞如何适应这估计大小的,忽略内部的任何自动调整大小实际的细胞。
所以,如果你改变.estimatedItemSize
到实际估计大小,你应该只在需要获得(约)调用cellForItemAt
的数量。
只是要小心,你不要高估的大小。如果你这样做,你要么有一大堆的
落得UICollectionViewFlowLayout的行为没有定义的,因为: 项目宽度必须小于UICollectionView减去离开了部分插图和正确的价值观的宽度,减去内容的左右值。
错误消息,或者你得到愚蠢(不准确)大小的滚动指标。
使我的估计大小接近实际大小的细胞和uicollectionview开始按预期工作,只在需要时获得细胞!谢谢你的提示 :) – BigAl
嗯?我只是在一个新的测试视图控制器中运行你的代码,并且只请求可见和部分可见的单元。 – DonMag
您的单元格是否使用自动布局来显示尺寸? – BigAl
我刚刚在外部xib文件中创建了基本单元,并且没有编辑就运行了你的代码。 – DonMag