Я пытаюсь добавить пользовательский UIView (LabelIcon) в родительское представление, которое не должно заботиться о размере дочернего элемента - он должен просто складывать их с полной шириной друг под другом в зависимости от высоты дочернего элемента (который будет варьироваться).
В настоящее время я добавляю дочерний элемент в родительский:
let locationLabel = LabelIcon(frame: .zero, icon: "location", text: "Lane\nlane")
let locationLabel2 = LabelIcon(frame: .zero, icon: "location", text: "Second text line\nLine line line\nAnother line\nsome more line")
content.addSubview(locationLabel)
content.addSubview(locationLabel2)
(Я не хочу устанавливать здесь рамку вручную - должно быть автоматически)
Ограничения этих представлений, чтобы они были хоть как-то видны (поскольку я не ставил рамку):
locationLabel.snp.makeConstraints { (make) in
make.top.left.right.equalToSuperview()
make.height.equalTo(40)
}
locationLabel2.snp.makeConstraints { (make) in
make.left.right.equalToSuperview()
make.top.equalTo(locationLabel.snp.bottom)
make.height.equalTo(40)
}
Это могло бы сработать, но было бы мучительно делать это для каждого элемента. Также я не знаю высоту внутреннего элемента прямо сейчас.
Чего я хочу добиться, так это не определять какие-либо жестко закодированные ограничения в родительском элементе. Детский вид должен сам решить, какой высоты он будет.
Ребенок определяется так:
class LabelIcon: UIView {
init(frame: CGRect, icon: String, text: String) {
super.init(frame: frame)
self.backgroundColor = UIColor.orange
let iconImageView = UIImageView(image: UIImage(named: icon))
iconImageView.contentMode = UIViewContentMode.scaleAspectFit
self.addSubview(iconImageView)
let label = UILabel()
label.textAlignment = .left
label.numberOfLines = 0
label.text = text
self.addSubview(label)
iconImageView.snp.makeConstraints { (make) in
make.top.equalToSuperview().offset(5)
make.left.equalToSuperview().offset(10)
}
label.snp.makeConstraints { (make) in
make.top.equalToSuperview()
make.left.equalTo(iconImageView.snp.right).offset(20)
}
}
required init?(coder aDecoder: NSCoder) {
fatalError("init(coder:) has not been implemented")
}
}
Как я могу определить дочерний элемент таким образом, чтобы он знал о ширине родителя, но высота будет выполняться автоматически на основе размера метки? Текст будет иметь динамическое количество строк.
В родительском будет много таких представлений, поэтому я хочу иметь как можно меньше ограничений (не делать это вручную для каждого экземпляра LabelIcon).
Основываясь на этом коде, это текущее состояние:
Все мои представления выполняются программно с автомакетом (с SnapKit, без раскадровки или xib). Я хотел бы использовать UIStackView, но в любом случае дочерний элемент должен иметь определенную высоту, чтобы он работал.
EDIT: сами представления видны при использовании этих ограничений:
locationLabel.snp.makeConstraints { (make) in
make.top.left.right.equalToSuperview()
}
locationLabel2.snp.makeConstraints { (make) in
make.left.right.equalToSuperview()
make.top.equalTo(locationLabel.snp.bottom)
}
Но виды расположены друг над другом (метка2 не ниже метки). Кроме того, представление в основном имеет размеры 0,0 - оранжевого фона нет:
Из принятого ответа:
Ограничения метки:
label.snp.makeConstraints { (make) in
make.top.equalToSuperview()
make.left.equalTo(iconImageView.snp.right).offset(20)
make.bottom.equalToSuperview().offset(-10)
make.right.equalToSuperview().offset(-10)
}
Родитель:
locationLabel.snp.makeConstraints { (make) in
make.top.left.equalToSuperview()
}
locationLabel2.snp.makeConstraints { (make) in
make.left.equalToSuperview()
make.top.equalTo(locationLabel.snp.bottom)
}
Результат: