我正在寻找使用自动布局来计算自定义补充视图大小的最佳方法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
看起来像一个跟踪 a 中的布局属性的内部类,UICollectionView
它不允许我在至少一个单元格的布局属性之前使补充视图出队。
我想到了以下几点:
- 我可以先布局单元格,然后再布局标题。但是,这使得设置单元格框架的逻辑更加复杂,因为它们取决于标题的高度。
- 我可以为单元格创建一个“虚拟”属性,创建标题并调整其大小,然后在布局第一个真实单元格时更新虚拟属性。这并不难,但也不是很干净!
- 我可以手动创建一个
ACVHeaderView
用于调整标题大小的实例。那会奏效,但在我的真实案例中,我有多个补充观点。必须保留我自己的补充类型记录并重用标识符和原型视图字典似乎很不整洁。我将复制集合视图出队机制中使用的逻辑。
实现这一目标的最佳方法是什么?我想我一定遗漏了一些更直接的东西,因为 Apple 鼓励开发人员正确使用动态类型和自动布局。