У меня есть табличное представление, где каждая ячейка отображает необязательный заголовок и многострочные субтитры. Я хочу, чтобы ячейка имела размеры самостоятельно (т.е. росла вместе с субтитрами, но оставалась максимально компактной). Для этого я использую tableView.rowHeight = UITableView.automaticDimension
Проблема, с которой я столкнулся, заключается в том, что вокруг субтитров в ячейках, которые имеют заголовок, имеется большое вертикальное расстояние.
Ячейки без заголовка сжимаются правильно. Также, когда я перезагружаю табличное представление, все расположение становится правильным.
Ожидаемое поведение :
Фактическое поведение :
Ячейка в основном имеет UIStackView
, прикрепленную к ячейке contentView
.
import UIKit
public class TableViewCellSubtitle: UITableViewCell {
private lazy var labelStack: UIStackView = {
let labelStack = UIStackView()
labelStack.alignment = .fill
labelStack.distribution = .fillProportionally
labelStack.axis = .vertical
return labelStack
}()
private lazy var titleLabel: UILabel = {
let titleLabel = UILabel()
titleLabel.backgroundColor = UIColor.blue.withAlphaComponent(0.3)
return titleLabel
}()
private lazy var subtitleLabel: UILabel = {
let subtitleLabel = UILabel()
subtitleLabel.numberOfLines = 0
subtitleLabel.backgroundColor = UIColor.green.withAlphaComponent(0.3)
return subtitleLabel
}()
override init(style: UITableViewCell.CellStyle, reuseIdentifier: String?) {
super.init(style: style, reuseIdentifier: reuseIdentifier)
setupUI()
setupConstraints()
}
required init?(coder aDecoder: NSCoder) {
fatalError("init(coder:) has not been implemented")
}
private func setupUI() {
contentView.addSubview(labelStack)
labelStack.translatesAutoresizingMaskIntoConstraints = false
labelStack.addArrangedSubview(titleLabel)
labelStack.addArrangedSubview(subtitleLabel)
}
private func setupConstraints() {
NSLayoutConstraint.activate([
labelStack.leadingAnchor.constraint(equalTo: contentView.leadingAnchor, constant: 16),
labelStack.topAnchor.constraint(equalTo: contentView.topAnchor, constant: 12),
contentView.bottomAnchor.constraint(equalTo: labelStack.bottomAnchor, constant: 12),
contentView.trailingAnchor.constraint(equalTo: labelStack.trailingAnchor, constant: 16)
])
}
public func setup(title: String?, subtitle: String) {
titleLabel.text = title
if title == nil {
labelStack.removeArrangedSubview(titleLabel)
titleLabel.removeFromSuperview()
}
subtitleLabel.text = subtitle
}
}
Я попытался установить обтекание контентом для субтитров
subtitleLabel.setContentHuggingPriority(.required, for: .vertical)
но заголовок увеличивается:
Если я установлю оба значения:
titleLabel.setContentHuggingPriority(.required, for: .vertical)
subtitleLabel.setContentHuggingPriority(.required, for: .vertical)
становится
Во всех случаях, если я перезагружаю ячейку или табличное представление, компоновка становится правильной (здесь при нажатии на ячейку):
Я знаю, что могу расположить ячейку без использования стека, но моя реальная реализация немного сложнее