Я создаю UIStackView
с изображением и меткой в пользовательском UIControl
, который будет в пользовательском UITableViewCell
, за исключением того, что мой UIStackView
имеет высоту и ширину 0, а XCode жалуется о нарушении ограничений. Только если я явно установлю высоту и ширину, он будет отображаться правильно, что мне не нужно, потому что текст метки меняется от ячейки к ячейке. (Все это происходит программно.)
Настройка В моем UITableViewCell
я получил следующее:
override init(style: UITableViewCell.CellStyle, reuseIdentifier: String?) {
super.init(style: style, reuseIdentifier: reuseIdentifier)
contentView.addSubview(control)
NSLayoutConstraint.activate([
control.bottomAnchor.constraint(equalTo: contentView.bottomAnchor),
control.leadingAnchor.constraint(equalTo: contentView.leadingAnchor),
control.trailingAnchor.constraint(equalTo: contentView.trailingAnchor),
control.topAnchor.constraint(equalTo: contentView.topAnchor),
])
}
// empty coder init as well
private let control: MyControl = {
let control: MyControl = MyControl()
control.translatesAutoresizingMaskIntoConstraints = false
return control
}()
В MyControl
, я просто есть UIStackView
, UIImageView
и UILabel
. Чтобы не утомлять вас кодом ... только UIStackView
(горизонтальная ось) использует ограничения, прикрепляя его к четырем сторонам. UIImageView
(инициируется с изображением) - это одно упорядоченное подпредставление, UILabel
- другое (инициируется с текстом по умолчанию).
Если вы хотите увидеть код:
class MyControl: UIControl {
override init(frame: CGRect) {
super.init(frame: frame)
addSubview(stackView)
stackView.addArrangedSubview(icon)
stackView.addArrangedSubview(contentLabel)
NSLayoutConstraint.activate([
stackView.bottomAnchor.constraint(equalTo: bottomAnchor),
stackView.leadingAnchor.constraint(equalTo: leadingAnchor),
stackView.trailingAnchor.constraint(equalTo: trailingAnchor),
stackView.topAnchor.constraint(equalTo: topAnchor),
])
}
// empty coder init as well
private let contentLabel: UILabel = {
let label: UILabel = UILabel()
label.text = "Initial text"
return label
}()
private let icon: UIImageView = {
let iv: UIImageView = UIImageView(image: UIImage(named: "placeholder_image")!)
iv.contentMode = .scaleAspectFit
return iv
}()
private let stackView: UIStackView = {
let stackView: UIStackView = UIStackView()
stackView.axis = .horizontal
stackView.translatesAutoresizingMaskIntoConstraints = false
return control
}()
}
То, что я ожидаю Я ожидаю UIControl
высоту изображения (потому что оно выше текста метки) и ширину изображения + текст метки. (И затем отобразить полную ширину ячейки таблицы из-за этого закрепления ограничения). И поскольку они устанавливаются при инициализации этих компонентов, я ожидаю, что они будут иметь высоту и ширину c для передачи в UIStackView
.
Что я получаю Высота и ширина ноль, и жалобы XCode о нарушении ограничений. Если я удаляю все ограничения, я не получаю жалоб, но ничего не появляется (как будто высота и ширина равны нулю, но XCode не волнует, потому что я не установил никаких ограничений).
What I ' ve Попробовал Буквально каждая комбинация ограничений макета, в том числе ни одна на все и столько, сколько я могу на все. То, что я хотел бы , так это чтобы текст image + label устанавливал высоту и ширину UIStackView
, который затем устанавливал бы высоту и ширину UIControl
, который затем устанавливал бы высоту в UITableViewCell
(я знаю, что у меня ширина 100% - это изменится позже).
Другие соображения В моем UITableViewCell
нет ничего особенного, что могло бы вызвать какие-либо проблемы, кроме этого в моем реальном коде у меня есть многострочная метка выше MyControl
, которая должна (и делает) заставлять мой UITableViewCell
увеличиваться в высоте.