UICollectionView:不同大小的项目不计算重复使用的项目

Posted

技术标签:

【中文标题】UICollectionView:不同大小的项目不计算重复使用的项目【英文标题】:UICollectionView: different size items is not calculated on reused items 【发布时间】:2012-11-10 01:24:30 【问题描述】:

我有一个包含不同项目大小的集合视图,我在

中声明
- (CGSize)collectionView:(UICollectionView *)collectionView
                  layout:(UICollectionViewLayout*)collectionViewLayout
  sizeForItemAtIndexPath:(NSIndexPath *)indexPath 

    FeedItem *item = [_imagesLinkArray objectAtIndex:indexPath.row];
    return CGSizeMake(250, 200*item.sizeFactor);

当单元格在collectionView:cellForItemAtIndexPath:中被重用时 该项目正在以重新使用的项目大小而不是sizeForItemAtIndexPath:中指定的大小呈现。

有什么想法吗?

【问题讨论】:

你能分享你的 collectionView:cellForItemAtIndexPath: 方法吗?此外,是否有可能您的单元格中的一个子视图的大小与单元格无关,导致它看起来只是单元格没有被调整大小? 这方面有什么进展吗? sizeForItemAtIndexPath: 当我滚动并且单元格被重用时没有被重新计算。 当我向下滚动单元格时,我遇到了同样的问题得到不同的对齐方式(比如丢失单元格之间的最小空间) 【参考方案1】:

似乎 collectionView:layout:sizeForItemAtIndexPath: 在布局准备时被调用一次,在 CollectionView 被渲染之前。

因此,每当您滚动并且单元格出列时,它都会在准备阶段调整为collectionView:layout:sizeForItemAtIndexPath: 提供的大小。您是否希望在具有特定 indexPath 的单元格可见时调用此方法?这样您就可以动态更改单元格大小?看来这不是这种方法可以使用的方法,它可以在布局准备阶段用于确定单元格的大小。

如果您出于某种原因需要重新计算尺寸,您可以使用 [UICollectionViewLayout invalidateLayout] 使布局无效。

【讨论】:

【参考方案2】:

集合视图重新计算项目的频率似乎低于UITableView。您必须将底层模型的大部分更改通知集合视图,例如通过调用[collectionView reloadData][collectionView insertItemsAtIndexPaths:indexPaths]

【讨论】:

这个答案为我指明了正确的方向。在collectionView:layout:sizeForItemAtIndexPath 上返回CGSize 之前调用reloadData 创造了奇迹!谢谢! 如何传播到单元格?【参考方案3】:

如果您使用自定义布局,则需要在自定义布局类中覆盖此函数。

override func shouldInvalidateLayoutForBoundsChange(newBounds: CGRect) -> Bool 
return true

【讨论】:

【参考方案4】:

您可以简单地覆盖滚动视图委托

func scrollViewDidScroll(_ scrollView: UIScrollView) 
    collectionView.collectionViewLayout.invalidateLayout()

【讨论】:

以上是关于UICollectionView:不同大小的项目不计算重复使用的项目的主要内容,如果未能解决你的问题,请参考以下文章

UICollectionView 自动高度

UICollectionView 中具有可变项目大小的恒定行距

使用动态大小的单元格限制 UICollectionView 的数量

通过切换布局触发的动画 UICollectionView 单元格调整大小

iOS UICollectionView 原型单元格大小属性被忽略

在 UICollectionView 滚动后获取可见项目的更新 IndexPath