【问题标题】:How to set UIView height equal to max of two subviews UILabel?如何设置 UIView 高度等于两个子视图 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 没有帮我解决这个问题。

【问题讨论】:

    标签: ios swift uilabel nslayoutconstraint snapkit


    【解决方案1】:

    内容拥抱

    内容拥抱线索更有可能挤压您的标签。你想要的是更尊重标签的高度。所以你宁愿使用抗压优先。但是,您实际上都不需要这些。

    布局约束

    由于您以编程方式设置约束,因此您还需要为标签设置 translatesAutoresizingMaskIntoConstraintsfalse

    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 作为子视图添加到另一个视图,它就会被调用。

    【讨论】:

      猜你喜欢
      • 2016-11-13
      • 2016-08-09
      • 1970-01-01
      • 2021-08-12
      • 2012-11-04
      • 2021-09-02
      • 2015-11-14
      • 2016-03-08
      • 1970-01-01
      相关资源
      最近更新 更多