具有自我调整大小的单元格的 UICollectionViewFlowLayout 在 reloadData 后崩溃

Posted

技术标签:

【中文标题】具有自我调整大小的单元格的 UICollectionViewFlowLayout 在 reloadData 后崩溃【英文标题】:UICollectionViewFlowLayout with self sizing cells crash after reloadData 【发布时间】:2015-04-20 12:38:21 【问题描述】:

我有一个自定义 UICollectionViewFlowLayout 与非零 estimatedItemSize 用于单元格。我在重新加载数据的 collectionView 中添加和删除单元格,有时当我尝试滚动到刚刚删除/添加的单元格时会崩溃。

使用回溯工具,我得到以下结果:

第 9 帧:0x0000000185c8385c CoreFoundation-[__NSArrayM objectAtIndex:] + 264 帧 #10: 0x000000018aeabb18 UIKit-[_UIFlowLayoutSection setSize:forItemAtIndexPath:] + 708 帧 #11: 0x000000018ae7cc5c UIKit-[UICollectionViewFlowLayout invalidationContextForPreferredLayoutAttributes:withOriginalAttributes:] + 156 帧 #12:0x000000018ae646c4 UIKit-[UICollectionView _checkForPreferredAttributesInView:originalAttributes:] + 212 框架 #13: 0x000000018a844968 UIKit-[UICollectionView _createPreparedCellForItemAtIndexPath:withLayoutAttributes:applyAttributes:] + 776

我猜我的流布局可以缓存单元格。

更新: 我的问题出现在 ios 8.3 上,但不在以前的版本上,包括 8.2。

【问题讨论】:

【参考方案1】:

不要使用具有非零estimatedItemSize 的自调整单元格。这是一个陷阱。

实现UICollectionViewDelegateFlowLayout 的方法collectionView(collectionView:collectionViewLayout:indexPath:),您可以通过在单元格的自定义实例上调用systemLayoutSizeFittingSize 来计算单元格的大小。

您可以在这个问题中找到更详细的信息:UICollectionView - dynamic cell height?

【讨论】:

正确的答案可能是“不要使用自动调整大小的单元格:)”

以上是关于具有自我调整大小的单元格的 UICollectionViewFlowLayout 在 reloadData 后崩溃的主要内容,如果未能解决你的问题,请参考以下文章

UICollectionView 自定义布局动画故障,在 performBatchUpdates 上具有自我调整单元格大小

自我调整大小的表格视图单元格不起作用

使用自我调整大小的单元格后,reloadData 不再起作用

具有自动调整大小的单元格的自定义 UICollectionViewLayout 会因估计的项目高度较大而中断

具有多个标签的自我调整大小的单元格不显示多行标签

给定具有多行标签的集合视图单元格的宽度,如何获得首选的 AutoLayout 高度?