Как установить высоту UIView равную максимуму двух подпредставлений UILabel? - PullRequest
2 голосов
/ 14 апреля 2019

У меня есть 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 Ответ

3 голосов
/ 14 апреля 2019

Содержание содержимого

Содержание содержимого приводит к большей вероятности сжатия ваших этикеток.То, что вы хотите, это высота ярлыков, чтобы быть более уважаемым.Поэтому вы бы предпочли использовать приоритет сопротивления сжатию.Однако на самом деле вам не нужен ни один из них.

Ограничения макета

Поскольку вы устанавливаете свои ограничения программно, вам также необходимо установить 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()

Other

Поскольку вы используете ограничения макета, вам не нужно вызывать sizeToFit на метках.Он ничего не делает.

Вызов layoutIfNeeded() внутри init также ничего не делает, так как он будет вызван в любом случае, как только вы добавите ComponentCell как подпредставление к другому представлению.

...