如何设置UIView高度等于两个子视图UILabel的最大值?

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了如何设置UIView高度等于两个子视图UILabel的最大值?相关的知识,希望对你有一定的参考价值。

我有动态高度的UILabel。我想将它的superview高度设置为等于UILabel高度的最大值。

class ComponentCell: UIView {
  private lazy var leftRow: UILabel = UILabel()
  private lazy var rightRow: UILabel = UILabel()

  init(leftValue: String, rightValue: String) {
    super.init(frame: .zero)
    leftRow.backgroundColor = .red
    leftRow.numberOfLines = 0
    leftRow.lineBreakMode = .byWordWrapping
    leftRow.text = leftValue
    rightRow.text = rightValue
    rightRow.backgroundColor = .yellow
    rightRow.numberOfLines = 0
    rightRow.lineBreakMode = .byWordWrapping
    self.addSubview(self.leftRow)
    self.addSubview(self.rightRow)
    leftRow.sizeToFit()
    rightRow.sizeToFit()
    leftRow.setContentHuggingPriority(.required, for: .vertical)
    rightRow.setContentHuggingPriority(.required, for: .vertical)
    self.translatesAutoresizingMaskIntoConstraints = false
    self.leftRow.snp.makeConstraints { make in
      make.top.equalToSuperview()
      make.left.equalToSuperview()
      make.width.equalToSuperview().dividedBy(2)
    }
    self.rightRow.snp.makeConstraints { make in
      make.top.equalToSuperview()
      make.right.equalToSuperview()
      make.width.equalToSuperview().dividedBy(2)
    }
    self.layoutIfNeeded()
  }

  required init?(coder aDecoder: NSCoder) {
    fatalError("init(coder:) has not been implemented")
  }
}

如果我设置leftRow.botton.equalTo(superview.bottom)rightRow.botton.equalTo(superview.bottom)它正在工作。但我认为这不是一个好方法。我不明白为什么setContentHuggingPriority没有帮助我解决这个问题。

答案

Content Hugging

内容拥抱更有可能挤压您的标签。你想要的是更加尊重标签的高度。所以你宁愿使用压缩阻力优先。但是你实际上不需要那些。

Layout Constraints

由于您以编程方式设置约束,因此您还需要为标签设置translatesAutoresizingMaskIntoConstraintsfalse

leftRow.translatesAutoresizingMaskIntoConstraints = false
rightRow.translatesAutoresizingMaskIntoConstraints = false

底部约束实际上是一个良好的开端,但您不希望将较小标签的高度不必要地与较大标签的高度相匹配。所以你想要添加一个“小于或等于底部锚点”的约束:

make.bottom.lessThanOrEqualTo(self.snp.bottom)

Lazy Variables

如果你想使用惰性变量,你必须改变初始化的方式。你编写它的方式,它在初始化类时立即初始化变量。但是你只希望它们在第一次使用时被初始化。为此你需要像这样写:

private lazy var leftRow: UILabel = {
    return UILabel() 
}()
private lazy var rightRow: UILabel = {
    return UILabel() 
}()

但是在您的情况下,您不需要延迟加载,因此您可以直接初始化它们:

private let leftRow = UILabel()
private let rightRow = UILabel()

Other

由于您使用的是布局约束,因此无需在标签上调用sizeToFit。它没有做任何事情。

在init中调用layoutIfNeeded()也没有做任何事情,因为一旦你将ComponentCell作为子视图添加到另一个视图,它就会被调用。

以上是关于如何设置UIView高度等于两个子视图UILabel的最大值?的主要内容,如果未能解决你的问题,请参考以下文章

Autolayout - 使超级视图高度等于子视图高度+常量,其中子视图是 textView

使用自动布局调整同级视图的大小时,使用子视图重新定位 UIView 不起作用

如何使 UIView 高度等于其子视图的附加高度,以便它可以轻松滚动到最后

如何使用自动布局在 UIScrollView 中为视图高度设置动画?

以编程方式设置 UICollectionViewController 单元格内的 UIView 子视图的高度?

无法使用它的子视图高度增加 uiview 的高度?