给定具有多行标签的视图单元格的宽度,如何获得首选的自动布局高度?

时间:2018-07-16 22:06:03

标签: ios uicollectionview autolayout uilabel uicollectionviewlayout

我正在使用UICollectionView在我的应用中构建具有自动调整大小的列表视图。让UICollectionViewFlowLayout进行垂直列表布局很痛苦,所以我正在编写自己的UICollectionViewLayout子类来实现这一点。

我的单元格看起来很像常规表格视图单元格-左侧是图像视图,中间垂直堆叠了几个标签,右侧是附件视图。标签可以换成几行,并根据系统字体大小设置增加字体大小,这就是为什么它们需要自定义大小的原因。约束是明智的-从左到图像视图,从图像视图到标签,标签到附件,附件到右边,标签到顶部和底部。

要通过preferredLayoutAttributesFittingAttributes调整单元格的大小,我需要根据集合视图的宽度来获得所需的单元格高度。我希望为此使用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;
}

1 个答案:

答案 0 :(得分:1)

如果您询问单元格的内容视图而不是单元格本身的大小,则可以显示结果。而且您必须提供小于所需高度的样本高度。

-(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;
}

我猜测内容视图未按我期望的方式固定在单元格的边界上。如果由于某种原因插入了内容视图,则此确切的实现可能会下降。但是解决此问题的关键是,将单元格内容固定到单元格的内容视图并不意味着该单元格本身将按照您的期望计算大小。