在 iOS8中,UICollectionViewFlowLayout
支持根据内容大小自动调整单元格的大小。这会根据单元格的内容调整其宽度和高度。
Is it possible to specify a fixed value for the width (or height) of all the cells and allow the other dimensions to resize?
对于一个简单的示例,考虑单元格中的多行标签,其约束将其定位到单元格的两侧。可以调整多行标签的大小以适应不同的文本。单元格应填充集合视图的宽度并相应调整其高度。相反,单元格的大小是随机的,当单元格大小大于集合视图的不可滚动维度时,它甚至会导致崩溃。
IOS8引入了方法 systemLayoutSizeFittingSize: withHorizontalFittingPriority: verticalFittingPriority:
对于集合视图中的每个单元格,布局在单元格上调用这个方法,传递估计的大小。对我来说,有意义的做法是在单元格上重写这个方法,传入给定的大小,并将水平约束设置为必需的,将低优先级设置为垂直约束。这样,水平大小固定在布局中设置的值上,垂直大小可以灵活使用。
就像这样:
- (UICollectionViewLayoutAttributes *)preferredLayoutAttributesFittingAttributes:(UICollectionViewLayoutAttributes *)layoutAttributes {
UICollectionViewLayoutAttributes *attributes = [super preferredLayoutAttributesFittingAttributes:layoutAttributes];
attributes.size = [self systemLayoutSizeFittingSize:layoutAttributes.size withHorizontalFittingPriority:UILayoutPriorityRequired verticalFittingPriority:UILayoutPriorityFittingSizeLevel];
return attributes;
}
然而,这种方法返回的大小完全是奇怪的。关于这个方法的文档对我来说非常不清楚,并且提到了使用常量 UILayoutFittingCompressedSize
UILayoutFittingExpandedSize
,它只表示一个零大小和一个相当大的值。
这个方法的 size
参数真的只是一种传入两个常量的方法吗?有没有办法达到我期望的行为,获得适当的高度为一个给定的大小?
1) Adding constraints that will be specify a specific width for the cell achieves the correct layout. This is a poor solution because that constraint should be set to the size of the cell's collection view which it has no safe reference to. The value for that constraint could be passed in when the cell is configured, but that also seems completely counterintuitive. This is also awkward because adding constraints directly to a cell or it's content view is causing many problems.
2)使用表格视图。表格视图以这种方式开箱即用,因为单元格有固定的宽度,但是这不能适应其他情况,比如 iPad 布局中的多列单元格有固定宽度。