Как 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