addSubview如何与intrinsicSizes一起使用?
以下代码的结果是:我没有看到标签。
我的理解是标签的内在大小将允许标签伸展。 为什么不发生这种情况?
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 }() }
这个:
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
。
实际上,自动布局为标签的instrinsicContentSize
创建了4个约束,但这些约束的优先级低于从frame
创建的约束,因此它们没有任何效果。 通过禁用从frame
创建约束,可以为优先级较低的instrinsicContentSize
约束提供影响UILabel
布局的机会。
您可以在Apple的“自动布局指南”的“ 内在内容大小 ”一节中更详细地了解这一点。
它是内在的内容大小而不是内在的内容位置保证给标签的宽度和高度如果它没有严格地具有可以修剪它的内容的前导和尾随约束,但至少你必须通过框架布局给出标签x,y位置或者自动布局但要设置
translatesAutoresizingMaskIntoConstraints to false