Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/swift/17.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ios 如何将UIView高度设置为两个子视图UILabel的最大值?_Ios_Swift_Uilabel_Nslayoutconstraint_Snapkit - Fatal编程技术网

Ios 如何将UIView高度设置为两个子视图UILabel的最大值?

Ios 如何将UIView高度设置为两个子视图UILabel的最大值?,ios,swift,uilabel,nslayoutconstraint,snapkit,Ios,Swift,Uilabel,Nslayoutconstraint,Snapkit,我必须用动态高度标注标签。我想将其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)

我必须用动态高度标注标签。我想将其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)
righrow.botton.equalTo(superview.bottom)
设置为有效。但我认为这不是一个好办法。我不明白为什么
setContentHuggingPriority
没有帮我解决这个问题。

Content Hugging 拥抱内容的潜在客户更有可能挤压你的标签。你想要的是标签的高度更受尊重。所以你宁愿使用抗压优先权。然而,你实际上不需要这些

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

leftRow.translatesAutoResizengMaskintoConstraints=false
rightRow.TranslatesAutoResizezingMaskintoConstraints=false
底部约束实际上是一个良好的开端,但您不希望不必要地将较小标签的高度与较大标签的高度相匹配。因此,您需要添加一个“小于或等于底部锚点”的约束:

make.bottom.lessThanOrEqualTo(self.snp.bottom)
惰性变量 如果你想使用惰性变量,你必须改变初始化的方式。按照您编写它的方式,它在初始化类时立即初始化变量。但您只希望在第一次使用它们时对其进行初始化。为此,您需要这样写:

private lazy var leftRow:UILabel={
返回UILabel()
}()
private lazy var rightRow:UILabel={
返回UILabel()
}()
但是,在您的情况下,您不需要延迟加载,因此您可以直接初始化它们:

private let leftRow=UILabel()
private let rightRow=UILabel()
其他 由于使用的是布局约束,因此不需要在标签上调用
sizeToFit
。它没有任何作用

在init中调用
layoutifneed()
也没有任何作用,因为一旦将
ComponentCell
作为子视图添加到另一个视图中,它将被调用