ios - 给定带有多行标签的 Collection View 单元格的宽度,如何获得首选的 AutoLayout 高度?

标签 ios uicollectionview autolayout uilabel uicollectionviewlayout

我正在使用 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/

相关文章:

ios - 根据其父 View 将自动布局应用于 UITableViewCell

swift - iOS8:viewDidLayoutSubviews()隐藏 Storyboard自动布局中的元素

ios - iPad 上的奇怪约束行为

ios - 使用 .strings 文件的 NSLocationWhenInUseUsageDescription 本地化不起作用

ios - 在录制视频时将动态文本渲染到 CVPixelBufferRef 上

ios - CollectionViewCell 不显示 TextView

ios - 如何随着内容大小的增加动态增加 UICollectionView 高度?

ios - 在 iOS 中从 txt 文件中搜索数据

ios - 如果我正在执行 CGImageRelease(sourceImageRef), Objective-C ,应用程序崩溃

ios - 如何在 iOS 中制作网格布局?