我正在使用 UICollectionView
在我的应用程序中构建一个可自行调整大小的 ListView 。让 UICollectionViewFlowLayout
进行垂直列表布局很痛苦,所以我正在编写自己的 UICollectionViewLayout
子类来完成它。
我的单元格看起来很像常规的表格 View 单元格 - 左侧是 ImageView ,中间垂直堆叠的几个标签,右侧是附件 View 。标签可以换成几行,并根据系统字体大小设置增加字体大小,这就是它们需要自动调整大小的原因。约束是合理的 - 左边到 ImageView , ImageView 到标签,标签到配件,配件到右边,标签到顶部和底部。
通过 preferredLayoutAttributesFittingAttributes
调整我的单元格大小,我需要在给定 Collection View 宽度的情况下获得所需的单元格高度。我希望使用 systemLayoutSizeFittingSize:horizontalPriority:verticalPriority:
为此,传递像 {desiredWidth, crazyLargeHeight}
这样的大小,UILayoutPriorityRequired
用于水平优先级,1 用于垂直优先级。但是我从 systemLayoutFittingSize
返回的大小不合理。宽度是单元格中的某个先前宽度值(不一定匹配 self.bounds.size.width
或传入的 layoutAttributes
' size。 width
),以及与该宽度匹配的高度。我也试过传递一个小高度而不是一个大高度,但它仍然没有返回它实际需要的大小。
那么如何在给定宽度值的情况下获得单元格的首选高度?
示例代码:
-(UICollectionViewLayoutAttributes *)preferredLayoutAttributesFittingAttributes:(UICollectionViewLayoutAttributes *)layoutAttributes
{
UICollectionViewLayoutAttributes *result = [super preferredLayoutAttributesFittingAttributes:layoutAttributes];
CGSize exampleSize = CGSizeMake(layoutAttributes.size.width, 20);
CGSize size = [self systemLayoutSizeFittingSize:exampleSize withHorizontalFittingPriority:UILayoutPriorityRequired verticalFittingPriority:1];
result.size = size;
return result;
}
最佳答案
事实证明,如果您向单元格的内容 View 而不是单元格本身询问大小,它就可以工作。而且您必须提供比所需高度小的样本高度。
-(UICollectionViewLayoutAttributes *)preferredLayoutAttributesFittingAttributes:(UICollectionViewLayoutAttributes *)layoutAttributes
{
UICollectionViewLayoutAttributes *result = [super preferredLayoutAttributesFittingAttributes:layoutAttributes];
CGSize exampleSize = CGSizeMake(layoutAttributes.size.width, 20); //magic number for example purposes...my cell will definitely be taller
CGSize size = [self.contentView systemLayoutSizeFittingSize:exampleSize withHorizontalFittingPriority:UILayoutPriorityRequired verticalFittingPriority:1];
result.size = size;
return result;
}
我猜测内容 View 没有按照我预期的方式固定到单元格的边界。如果由于某种原因插入了内容 View ,那么这个确切的实现可能会失败。但解决这个问题的关键是,将单元格内容固定到单元格的内容 View 并不意味着单元格本身会按照您的预期计算大小。
关于ios - 给定带有多行标签的 Collection View 单元格的宽度,如何获得首选的 AutoLayout 高度?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51370708/