Я создаю кастом UITableViewCell
.Пока все, что я хочу, это чтобы UIButton
слева (checkButton
) и два UILabel
s (titleLabel
и notesLabel
) справа от кнопки.
По сути, он должен выглядеть как стандартный UITableViewCell
с изображением и двумя текстовыми метками (но, пожалуйста, не говорите мне просто повторно использовать стандартную ячейку, потому что я не могу сделать это по разным причинам),Кнопка должна иметь фиксированный размер (16x16) и быть вертикально центрированной в ячейке.Эти две метки должны быть перенесены и расширены, чтобы соответствовать их содержанию.Я пытаюсь определить эту ячейку программно, поэтому я создал приведенный ниже инициализатор для определения ограничений.
override init(style: UITableViewCell.CellStyle, reuseIdentifier: String?) {
super.init(style: style, reuseIdentifier: reuseIdentifier)
titleLabel.translatesAutoresizingMaskIntoConstraints = false
titleLabel.font = UIFont.systemFont(ofSize: 16)
titleLabel.lineBreakMode = .byWordWrapping
titleLabel.numberOfLines = 0
contentView.addSubview(titleLabel)
checkButton.translatesAutoresizingMaskIntoConstraints = false
contentView.addSubview(checkButton)
notesLabel.translatesAutoresizingMaskIntoConstraints = false
notesLabel.font = UIFont.systemFont(ofSize: 13)
notesLabel.lineBreakMode = .byWordWrapping
notesLabel.numberOfLines = 0
contentView.addSubview(notesLabel)
addConstraint(NSLayoutConstraint(item: titleLabel,
attribute: .top,
relatedBy: .equal,
toItem: contentView,
attribute: .top,
multiplier: 1,
constant: 0))
addConstraint(NSLayoutConstraint(item: notesLabel,
attribute: .top,
relatedBy: .equal,
toItem: titleLabel,
attribute: .bottom,
multiplier: 1,
constant: 0))
addConstraint(NSLayoutConstraint(item: titleLabel,
attribute: .trailing,
relatedBy: .equal,
toItem: contentView,
attribute: .trailing,
multiplier: 1,
constant: -10))
addConstraint(NSLayoutConstraint(item: notesLabel,
attribute: .trailing,
relatedBy: .equal,
toItem: contentView,
attribute: .trailing,
multiplier: 1,
constant: -10))
addConstraint(NSLayoutConstraint(item: notesLabel,
attribute: .bottom,
relatedBy: .equal,
toItem: contentView,
attribute: .bottom,
multiplier: 1,
constant: 0))
addConstraint(NSLayoutConstraint(item: checkButton,
attribute: .leading,
relatedBy: .equal,
toItem: contentView,
attribute: .leading,
multiplier: 1,
constant: 20))
addConstraint(NSLayoutConstraint(item: checkButton,
attribute: .centerY,
relatedBy: .equal,
toItem: contentView,
attribute: .centerY,
multiplier: 1,
constant: 0))
addConstraint(NSLayoutConstraint(item: checkButton,
attribute: .height,
relatedBy: .equal,
toItem: nil,
attribute: .notAnAttribute,
multiplier: 0,
constant: 16))
addConstraint(NSLayoutConstraint(item: checkButton,
attribute: .width,
relatedBy: .equal,
toItem: nil,
attribute: .notAnAttribute,
multiplier: 0,
constant: 16))
addConstraint(NSLayoutConstraint(item: notesLabel,
attribute: .leading,
relatedBy: .equal,
toItem: checkButton,
attribute: .trailing,
multiplier: 1,
constant: 12))
addConstraint(NSLayoutConstraint(item: titleLabel,
attribute: .leading,
relatedBy: .equal,
toItem: checkButton,
attribute: .trailing,
multiplier: 1,
constant: 12))
}
Когда я запускаю этот код, он работает в основном так, как ожидается, за исключением того, что Xcode печатает следующеепредупреждение: [Warning] Warning once only: Detected a case where constraints ambiguously suggest a height of zero for a tableview cell's content view. We're considering the collapse unintentional and using standard height instead.
Обычно я просто игнорирую это, но, похоже, препятствует расширению ячейки до ее содержимого.Например, если у одной из меток достаточно содержимого для расширения до 3 строк, отображается только первая строка.Я хочу, чтобы метки (и, соответственно, ячейка) расширялись, чтобы соответствовать их содержанию.Что я делаю не так с ограничениями по высоте?