UICollectionView 单元格配置太多次

Posted

技术标签:

【中文标题】UICollectionView 单元格配置太多次【英文标题】:UICollectionView cell gets configured too many times 【发布时间】:2013-03-20 12:20:36 【问题描述】:

我注意到UICollectionView 在其数据源上多次调用collectionView:cellForItemAtIndexPath:。例如,在每个 layoutSubviews 上,所有单元格都被“重新配置”,无论它们是否已经可见。

collectionView:cellForItemAtIndexPath: 被调用时,我们应该:

您对此方法的实现负责创建, 配置并返回给定项目的适当单元格。 您可以通过调用 dequeueReusableCellWithReuseIdentifier:forIndexPath: 的方法 集合视图并传递对应于的重用标识符 你想要的细胞类型。该方法总是返回一个有效的单元格 目的。收到单元格后,您应该设置任何属性 对应对应item的数据,执行任意 额外需要的配置,并返回单元格。

问题是配置单元并不总是一项廉价的操作,我不明白为什么要重新配置已经配置的单元。

我们如何避免单元的冗余配置?还是有什么我没有正确理解的地方?

【问题讨论】:

查看collectionView: willDisplayCellAtIndexPath,看看它被调用的次数是多于还是少于cellForItemAtIndexPath。您只需要真正使用 cFIAIP 来分配单元格,wDCAIP 是您应该执行实际显示逻辑的地方。 【参考方案1】:

我认为您无法避免这种情况。问题是 UICollectionView 太笼统了,FlowLayout 不是唯一的布局。由于您可以进行疯狂的布局,因此任何布局更改(例如 layoutsubviews)都可能完全改变您想要的布局——纵向网格和横向三角形排列......知道布局应该是什么的唯一方法是找出每个单元格的位置和大小。

UICollection 视图对于很多元素来说并不便宜。

【讨论】:

【参考方案2】:

配置cell 后只需使用cell.tag = 1; 即可,下次您可以避免使用if(!cell.tag) 重新配置相同的单元格。

- (UICollectionViewCell *)collectionView:(UICollectionView *)collectionView cellForItemAtIndexPath:(NSIndexPath *)indexPath 
    UICollectionViewCell *cell = [collectionView dequeueReusableCellWithReuseIdentifier:YourCellReuseIdentifier forIndexPath:indexPath];
    if(!cell)
        //Create cell ...
     
    if(!cell.tag)
        //Do things you have to do only once
    
    else
        //DO things you have to do every time.
    

    return cell;

【讨论】:

以上是关于UICollectionView 单元格配置太多次的主要内容,如果未能解决你的问题,请参考以下文章

UICollectionView 布局间距问题。单元格之间的空间太大

配置 UICollectionView 以保持相同的单元格视图

Swift - UICollectionView reloadItems 需要太长时间

以编程方式声明的 UICollectionView 不会更改 Swift 5 中单元格的大小

UICollectionView,按钮未出现

处理 UICollectionView 单元格上的滑动:在 UICollectionView 或每个单元格上实现处理程序?