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 单元格调整大小