为什么索引路径上的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那样以零碎的方式请求单元格?这是一个问题吗?

+0

嗯?我只是在一个新的测试视图控制器中运行你的代码,并且只请求可见和部分可见的单元。 – DonMag

+0

您的单元格是否使用自动布局来显示尺寸? – BigAl

+0

我刚刚在外部xib文件中创建了基本单元,并且没有编辑就运行了你的代码。 – DonMag

有点调查后...

当使用flowLayout.estimatedItemSize,自动布局,使布局传递来计算许多细胞如何适应这估计大小的,忽略内部的任何自动调整大小实际的细胞。

所以,如果你改变.estimatedItemSize到实际估计大小,你应该只在需要获得(约)调用cellForItemAt的数量。

只是要小心,你不要高估的大小。如果你这样做,你要么有一大堆的

落得UICollectionViewFlowLayout的行为没有定义的,因为: 项目宽度必须小于UICollectionView减去离开了部分插图和正确的价值观的宽度,减去内容的左右值。

错误消息,或者你得到愚蠢(不准确)大小的滚动指标。

+0

使我的估计大小接近实际大小的细胞和uicollectionview开始按预期工作,只在需要时获得细胞!谢谢你的提示 :) – BigAl