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