ios - 在自定义 UICollectionViewLayout 中使用自动布局调整补充 View 的大小

标签 ios uicollectionview autolayout uicollectionviewlayout uicollectionreusableview

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

我有一个标题补充 View ACVHeaderView具有自动布局约束。

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

理想情况下,我想通过调用 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'

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

我想到了以下几点:
  • 我可以先布局单元格,然后再布局标题。然而,这使得设置单元格框架的逻辑更加复杂,因为它们取决于标题的高度。
  • 我可以为单元格创建一个“虚拟”属性,创建标题并调整其大小,然后在布局第一个真实单元格时更新虚拟属性。这并不难,但也不是很干净!
  • 我可以手动创建 ACVHeaderView 的实例用于调整标题的大小。那会奏效,但在我的真实案例中,我有多个补充观点。必须保留我自己的补充类型记录并重用标识符和原型(prototype) View 字典似乎很不整洁。我将复制 Collection View 出队机制中使用的逻辑。

  • 实现这一目标的最佳方法是什么?我想我一定遗漏了一些更直接的东西,因为 Apple 鼓励开发人员正确使用动态类型和自动布局。

    最佳答案

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

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

    关于ios - 在自定义 UICollectionViewLayout 中使用自动布局调整补充 View 的大小,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25672543/

    相关文章:

    ios - 无法解析格式字符串错误

    ios - 当其中的文本字段开始编辑时增加单元格的高度

    ios - TableView Controller 没有显示 Assets 文件夹中的内容,或者根本没有显示任何内容

    ios - 添加 View 、删除 View 并再次添加 View 会破坏自动布局约束

    objective-c - UIView 元素布局约束

    ios - 删除日文字符时 Swift "can not increment endIndex"

    ios - 条件绑定(bind)错误极度迷惑

    ios - Swift 2 - 两个 UICollectionViewController 之间的协议(protocol)委托(delegate)

    ios - Objective c 中的自动滚动 Uicollectionview

    iphone - 将 NSLayoutConstraints 应用于 UIView 子类