Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/ios/120.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ios 为什么UICollectionView';索引路径处的s cellForItem在开始时为所有单元格调用_Ios_Swift_Uitableview_Uicollectionview_Uicollectionviewcell - Fatal编程技术网

Ios 为什么UICollectionView';索引路径处的s cellForItem在开始时为所有单元格调用

Ios 为什么UICollectionView';索引路径处的s cellForItem在开始时为所有单元格调用,ios,swift,uitableview,uicollectionview,uicollectionviewcell,Ios,Swift,Uitableview,Uicollectionview,Uicollectionviewcell,为什么UICollectionView的cellForItem在索引路径处会在显示之前为所有单元格调用。collectionView不应该只获取它需要的单元格吗..即。屏幕上显示的单元格(如tableview)会是什么 台阶 带有ViewController的故事板。ViewController具有CollectionView。CollectionView具有垂直流布局 ViewController具有collectionView的IBOutlet,并实现collectionView的数据源和

为什么UICollectionView的cellForItem在索引路径处会在显示之前为所有单元格调用。collectionView不应该只获取它需要的单元格吗..即。屏幕上显示的单元格(如tableview)会是什么

台阶

  • 带有ViewController的故事板。ViewController具有CollectionView。CollectionView具有垂直流布局

  • ViewController具有collectionView的IBOutlet,并实现collectionView的数据源和委托方法

  • 在数据源和委托方法中,单元格(其大小使用autolayout)被传递到collectionview。。索引路径处的项的单元格

在传递单元格之前放置打印语句,表明在屏幕上显示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的宽度减去部分插入的左侧和右侧值,再减去内容插入的左侧和右侧值


错误消息,或者您得到了愚蠢(不准确)大小的滚动指示器。

经过一点调查

使用
flowLayout.estimatedItemSize
时,自动布局会进行布局传递,以计算在该估计大小下可容纳的单元格数量,而忽略实际单元格中的任何自动大小调整

因此,如果将
.estimatedItemSize
更改为实际的估计大小,则应仅根据需要获取调用
cellForItemAt
的次数

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

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


错误消息,或者您得到了愚蠢(不准确)大小的滚动指示器。

hmmm?我刚刚在一个新的测试视图控制器中运行了您的代码,并且只请求可见和部分可见的单元格。您的单元格是否使用自动布局来确定其大小?我刚刚在外部xib文件中创建了基本单元格,并在不进行编辑的情况下运行了您的代码。hmmm?我刚刚在一个新的测试视图控制器中运行了您的代码,只请求可见和部分可见的单元格。您的单元格大小是否使用autolayout?我刚刚在外部xib文件中创建了基本单元格,并在不进行编辑的情况下运行代码。使我的估计大小接近单元格的实际大小,uicollectionview开始按预期工作,仅在需要时获取单元格!感谢提示:)使我的估计大小接近单元格的实际大小,uicollectionview开始按预期工作,仅在需要时获取单元格!谢谢你的提示:)