我正在尝试UICollectionViewCells使用自动布局进行自我调整,但我似乎无法让单元格根据内容调整自己的大小.我无法理解如何根据单元格内容中的内容更新单元格的大小.
这是我尝试过的设置:
UICollectionViewCell一个UITextView.UITextView已禁用.UITextView固定在单元格左侧,显式宽度为320.UITextView固定到单元格的顶部.UITextView具有高度限制设置为其中一个恒定的UITextView报告将适合文本.这是单元格背景设置为红色,UITextView背景设置为蓝色的样子:

我把我已经在GitHub上玩的项目在这里.
在iOS 8中,UICollectionViewFlowLayout支持根据自己的内容大小自动调整单元格大小.这根据其内容在宽度和高度上调整单元的大小.
是否可以为所有单元格的宽度(或高度)指定固定值,并允许其他尺寸调整大小?
对于一个简单的示例,请考虑单元格中的多行标签,其中约束将其定位到单元格的两侧.可以通过不同方式调整多行标签的大小以容纳文本.单元格应填充集合视图的宽度并相应地调整其高度.相反,单元格的大小是随意调整的,当单元格大小大于集合视图的不可滚动维度时,它甚至会导致崩溃.
iOS 8引入了方法systemLayoutSizeFittingSize: withHorizontalFittingPriority: verticalFittingPriority:对于集合视图中的每个单元格,布局在单元格上调用此方法,传入估计的大小.对我来说有意义的是在单元格上覆盖此方法,传递给定的大小并将水平约束设置为required,并将垂直约束设置为低优先级.这样,水平尺寸固定为布局中设置的值,垂直尺寸可以灵活.
像这样的东西:
- (UICollectionViewLayoutAttributes *)preferredLayoutAttributesFittingAttributes:(UICollectionViewLayoutAttributes *)layoutAttributes {
UICollectionViewLayoutAttributes *attributes = [super preferredLayoutAttributesFittingAttributes:layoutAttributes];
attributes.size = [self systemLayoutSizeFittingSize:layoutAttributes.size withHorizontalFittingPriority:UILayoutPriorityRequired verticalFittingPriority:UILayoutPriorityFittingSizeLevel];
return attributes;
}
Run Code Online (Sandbox Code Playgroud)
然而,这种方法给出的尺寸是完全奇怪的.关于这种方法的文档对我来说是非常不清楚的,并提到使用UILayoutFittingCompressedSize UILayoutFittingExpandedSize仅代表零大小和相当大的常量.
size这个方法的参数真的只是传递两个常量的方法吗?难道没有办法实现我期望获得给定大小的适当高度的行为吗?
1)添加将为单元格指定特定宽度的约束可实现正确的布局.这是一个糟糕的解决方案,因为该约束应该设置为单元的集合视图的大小,它没有安全的引用.在配置单元格时,可以传入该约束的值,但这似乎也完全违反直觉.这也很尴尬,因为直接向单元格或其内容视图添加约束会导致许多问题.
2)使用表格视图.由于单元格具有固定的宽度,因此表视图以这种方式开箱即用,但这不适用于其他情况,例如在多列中具有固定宽度单元格的iPad布局.