Как addSubview работает с intrinsicSizes?

Результат следующего кода: я не вижу метку.

Насколько я понимаю, intrinsicSize метки позволит растянуть метку. Почему этого не происходит?

import UIKit

class ViewController: UIViewController {

    override func viewDidLoad() {
        super.viewDidLoad()
        view.addSubview(label)
    }

    let label : UILabel = {
        let label = UILabel()
        label.text = "How are you doing today my friend"
        label.backgroundColor = .orange

        return label
    }()
}

2 ответа

Решение

Это:

let label = UILabel()

создает ярлык на (0, 0) с шириной 0 и высота 0, По умолчанию iOS создаст ограничения из frame для положения, ширины и высоты этикетки.

Если вы хотите использовать внутренний размер метки, отключите создание ограничений из фрейма и задайте ограничения метки, чтобы поместить его в представление.

Например (после добавления метки в качестве подпредставления):

label.translatesAutoresizingMaskIntoConstraints = false
label.centerXAnchor.constraint(equalTo: view.centerXAnchor).isActive = true
label.centerYAnchor.constraint(equalTo: view.centerYAnchor).isActive = true

Или вы можете использовать label.intrisicContentSize когда вы создаете кадр:

label.frame = CGRect(origin: CGPoint(x: 40, y: 100), size: label.intrinsicContentSize)

Примечание: если вы используете label.intrinsicSize установить frame, frame не изменится при изменении текста метки. Вам придется обновить его снова с помощью:

label.frame.size = label.intrinsicContentSize

после смены label.text,


В действительности, Auto Layout создает 4 ограничения для метки instrinsicContentSize, но эти ограничения имеют более низкий приоритет, чем ограничения, созданные из frameпоэтому они не имеют никакого эффекта. Отключив создание ограничений из frameВы отдаете более низкий приоритет instrinsicContentSize ограничивает возможность повлиять на макет UILabel,

Вы можете прочитать об этом более подробно в Apple Auto Layout Guide в разделе, озаглавленном " Внутренний размер контента".

Это внутренний размер контента, а не внутренняя позиция содержимого, чтобы дать ширину и высоту для метки. Если у него нет жестких ограничений на начало и конец, которые могут обрезать его контент, но, по крайней мере, вы должны задать метку x,y либо по компоновке кадра, либо автоматическое расположение, но установить

  translatesAutoresizingMaskIntoConstraints to false
Другие вопросы по тегам