我有动态高度的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
没有帮助我解决这个问题。
内容拥抱更有可能挤压您的标签。你想要的是更加尊重标签的高度。所以你宁愿使用压缩阻力优先。但是你实际上不需要那些。
由于您以编程方式设置约束,因此您还需要为标签设置translatesAutoresizingMaskIntoConstraints
到false
:
leftRow.translatesAutoresizingMaskIntoConstraints = false
rightRow.translatesAutoresizingMaskIntoConstraints = false
底部约束实际上是一个良好的开端,但您不希望将较小标签的高度不必要地与较大标签的高度相匹配。所以你想要添加一个“小于或等于底部锚点”的约束:
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
作为子视图添加到另一个视图,它就会被调用。