在自定义UICollectionViewLayout中使用自动布局调整补充视图的大小

时间:2014-09-04 18:23:51

标签: ios uicollectionview autolayout uicollectionviewlayout uicollectionreusableview

我正在寻找使用自动布局来计算自定义UICollectionViewLayout中补充视图大小的最佳方法。为了清楚起见,这是我想要实现的简化解释。

我有一个带有自动布局限制的标题补充视图ACVHeaderView

prepareLayout:中,我想计算节标题的大小并为其创建补充视图布局属性。然后我想迭代该部分中的单元格,为单元格创建和存储布局属性。在“构建”布局后,这些属性将全部存储为由其他集合视图布局方法返回。

理想情况下,我想通过调用collectionView:dequeueReusableSupplementaryViewOfKind:withReuseIdentifier:forIndexPath:来调整标题大小,执行自动布局过程,然后使用view:systemLayoutSizeFittingSize:。这正是我为单元格本身所做的事情(遵循我从WWDC获得的一些示例代码)。

然而,此错误导致此错误:

2014-09-04 18:51:53.852 ACV[7298:167827] *** Assertion failure in -[UICollectionViewData layoutAttributesForSupplementaryElementOfKind:atIndexPath:], /SourceCache/UIKit_Sim/UIKit-3302.3.1/UICollectionViewData.m:853
2014-09-04 18:51:53.916 ACV[7298:167827] *** Terminating app due to uncaught exception 'NSInternalInconsistencyException', reason: 'request for layout attributes for supplementary view UICollectionElementKindSectionHeader in section 0 when there are only 0 sections in the collection view'

我理解我认为的问题...在我调整该部分中的任何单元格之前,我试图将标题的补充视图出列。这意味着我还没有为该部分中的任何单元格创建任何布局属性(使用UICollectionViewLayoutAttributes.forCellWithIndexPath:)。 UICollectionViewData看起来像是跟踪UICollectionView中布局属性的内部类,它不允许我在至少有一个单元格的布局属性之前出现补充视图。

我想到了以下几点:

  1. 我可以先布置单元格,然后是标题。但是,这使得设置单元框架的逻辑更加复杂,因为它们取决于标题的高度。
  2. 我可以为单元格创建'虚拟'属性,创建并调整标题大小,然后在布局第一个真实单元格时更新虚拟属性。这不难,但也不是很干净!
  3. 我可以手动创建ACVHeaderView的实例,以用于调整标题大小。这可行,但在我的实际案例中,我有多个补充意见。保持我自己的补充类型记录并重用标识符和原型视图字典似乎是不整洁的。我将复制集合视图出列机制中使用的逻辑。
  4. 实现这一目标的最佳方法是什么?我想我必须错过更直接的东西,因为Apple鼓励开发人员正确使用动态类型和自动布局。

1 个答案:

答案 0 :(得分:0)

部分中可能有一个包含0个单元格的部分,因此不应该导致此问题。我认为问题在于您添加了标头的补充属性,但该部分不可用(numberOfSectionsInCollectionView返回0)。

我会确定的 numberOfSectionsInCollectionView: 添加补充标题属性时,不会返回0。