Ios 如何将UIView高度设置为两个子视图UILabel的最大值?
我必须用动态高度标注标签。我想将其superview高度设置为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)
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
作为子视图添加到另一个视图中,它将被调用