UIView дочерний автоматический размер кадра

Я пытаюсь добавить пользовательский 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)
}

Результат:

введите здесь описание изображения


person Tunerx    schedule 25.07.2018    source источник


Ответы (1)


Внутри метки представления добавьте нижнее ограничение, подобное этому

 make.bottom.equalToSuperview().offset(10)

//

Добавить правильное ограничение

make.right.equalToSuperview().offset(10)

удалить любую статическую высоту

make.height.equalTo(40)

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

person Sh_Khan    schedule 25.07.2018
comment
Обновлено: label.snp.makeConstraints { (make) в 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) в make.top.left.equalToSuperview() } locationLabel2.snp.makeConstraints { (make) в make.left. equalToSuperview() make.top.equalTo(locationLabel.snp.bottom) } Спасибо! - person Tunerx; 25.07.2018