ios - 如何将 UIView 高度设置为等于两个 subview UILabel 的最大值?

标签 ios swift uilabel nslayoutconstraint snapkit

我必须使用动态高度的 UILabel。我想将其 super View 高度设置为等于 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 没有帮助我解决这个问题。

最佳答案

内容拥抱

拥抱内容更有可能挤压您的标签。您想要的是标签的高度得到更多尊重。所以你宁愿使用抗压优先。然而你实际上不需要这些。

布局约束

由于您是以编程方式设置约束,因此您还需要将标签的 translatesAutoresizingMaskIntoConstraints 设置为 false:

leftRow.translatesAutoresizingMaskIntoConstraints = false
rightRow.translatesAutoresizingMaskIntoConstraints = false

底部约束实际上是一个好的开始,但您不想让较小标签的高度不必要地适应较大标签的高度。因此,您需要添加一个“小于或等于底部 anchor ”的约束:

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

惰性变量

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

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

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

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

其他

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

在 init 中调用 layoutIfNeeded() 也不会执行任何操作,因为一旦将 ComponentCell 作为 subview 添加到另一个 View ,它就会被调用。

关于ios - 如何将 UIView 高度设置为等于两个 subview UILabel 的最大值?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55673431/

相关文章:

ios - 调整 UITableViewCell 内的 UILabel 以适应内容

ios - UILabel 垂直着色为 2 种颜色

ios - 确定用户是否已启用应用程序的 Safari 内容拦截器扩展

ios - RSS 提要获取不完整的描述 - Swift 3

iphone - Swift:如何以编程方式设置 iphone 音量

ios - 进入地理围栏且此时无网络连接时发送请求

ios - 如何计算 UILabel 的高度?

javascript - 使用自定义方案打开应用程序 - 防止 "open in <appname>"警告?

ios - 如果拖动 UISwitch 不起作用

ios - SKView 集成到 UIViewController 中,UITextFields 滞后