约束UIImageView高度以尊重UITableViewCell中的动态UILabel高度

时间:2018-10-02 04:33:34

标签: ios swift autolayout

我有一个UITableView,其中填充了一种类型的自定义UITableViewCell。每个单元格包含一个标题(UILabel),字幕(UILabel)和缩略图(UIImageView),如下所示。

prototype cell visual

所有三个子视图的宽度都是固定的,但是只有字幕标签具有固定的高度。标题标签的高度根据文本的数量而变化。我已将标题标签的numberOfLines设置为0以反映这一点。

我的目标:单元格的高度应由标题标签的高度确定。换句话说,像元高度应为两个标签高度之和加上三个垂直填充间隙的总和。图像高度应设置为单元格的最终高度。

我当前的实现方式:我设置了以下自动布局约束:

  • 缩略图在顶部,左侧和底部固定为超级视图
  • 缩略图的宽度与超级视图的宽度成正比,为0.2的倍数。
  • 缩略图的右侧与标题和副标题挂钩(后缀空格= 8)
  • 标题固定在顶部和右侧(尾部空间= 8)
  • 标题底部固定有字幕(后缀空格= 8)
  • 标题高度大于或等于24
  • 将字幕固定在右侧和底部(字幕空间= 8)
  • 字幕高度等于20

另外:

  • 标题numberOfLines = 0
  • 缩略图contentMode =外观填充
  • 缩略图clipToBounds = true

问题:图像高度不考虑标签的高度,因此单元格的高度设置为图像的整个高度,并且标题标签垂直拉伸。考虑到我曾经使用过的约束,这是可以理解的,但是我不想发生这种情况。

我的问题:如何限制UIImageView的高度以尊重单元格的高度(由动态标签高度决定),而不是让单元格的高度尊重UIImageView的高度?

我的环境

  • Xcode 10
  • iOS 11和12
  • 迅速4.2

2 个答案:

答案 0 :(得分:3)

尝试将thumbnail垂直compression resistance设置为低于title垂直hugging priority。在代码中它将如下所示:

    thumbnail.setContentCompressionResistancePriority(.defaultLow, for: .vertical)
    titleLabel.setContentHuggingPriority(.required, for: .vertical)

答案 1 :(得分:1)

我将解释垂直约束使之成为可能。

  • 使用足够的填充将标签顶部固定到contentView上,以使图像视图停留在其内部。
  • 将subtitleLabel的顶部固定在titleLabel的底部。
  • 将子标题的底部固定在类似于contentView底部的位置,以便图像视图停留在其内部。

您的单元格现在具有基于上述约束的高度。现在,您只需要确保将图像视图放置在此高度内即可。

  • 将缩略图的顶部固定在标签的顶部,将字幕的底部固定在底部。

示例:

  • titleLabel.top-> contentView.top + 10
  • subtitleLabel.top-> titleLabel.bottom + 5
  • subtitleLabel.bottom-> contentView.bottom-10
  • imageView.top-> titleLabel.top-5
  • imageView.bottom-> subtitleLabel.bottom + 5