如何设置 UIView 高度等于两个子视图 UILabel 的最大值?
Posted
技术标签:
【中文标题】如何设置 UIView 高度等于两个子视图 UILabel 的最大值?【英文标题】:How to set UIView height equal to max of two subviews UILabel? 【发布时间】:2019-04-14 08:37:13 【问题描述】:我必须使用动态高度的 UILabel。我想将它的超级视图高度设置为 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
没有帮我解决这个问题。
【问题讨论】:
【参考方案1】:内容拥抱
内容拥抱线索更有可能挤压您的标签。你想要的是更尊重标签的高度。所以你宁愿使用抗压优先。但是,您实际上都不需要这些。
布局约束
由于您以编程方式设置约束,因此您还需要为标签设置 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
作为子视图添加到另一个视图,它就会被调用。
【讨论】:
以上是关于如何设置 UIView 高度等于两个子视图 UILabel 的最大值?的主要内容,如果未能解决你的问题,请参考以下文章
Autolayout - 使超级视图高度等于子视图高度+常量,其中子视图是 textView
使用自动布局调整同级视图的大小时,使用子视图重新定位 UIView 不起作用
IOS - UIView中使用AutoLayout的UILabel动态高度
如何使 UIView 高度等于其子视图的附加高度,以便它可以轻松滚动到最后