Ios addSubview如何与intrinsicSizes一起工作?

Ios addSubview如何与intrinsicSizes一起工作?,ios,swift,uiview,addsubview,intrinsic-content-size,Ios,Swift,Uiview,Addsubview,Intrinsic Content Size,以下代码的结果是:我看不到标签 我的理解是,标签的本质将允许标签拉伸。为什么没有发生 import UIKit class ViewController: UIViewController { override func viewDidLoad() { super.viewDidLoad() view.addSubview(label) } let label : UILabel = { let label = UIL

以下代码的结果是:我看不到标签

我的理解是,标签的本质将允许标签拉伸。为什么没有发生

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
    }()
}
这:

(0,0)
处创建宽度
0
和高度
0
的标签。默认情况下,iOS将从
框架
为标签的位置、宽度和高度创建约束

如果要使用标签的固有大小,请禁用从框架创建约束,并提供标签约束以将其放置在视图中

例如(将标签添加为子视图后):

或者,您可以在创建框架时使用
标签.intrisicContentSize

label.frame = CGRect(origin: CGPoint(x: 40, y: 100), size: label.intrinsicContentSize)
注意:如果使用
label.intrinsicSize
设置
框架
,则在更改标签文本时,
框架
不会更改。您必须使用以下内容再次更新它:

label.frame.size = label.intrinsicContentSize
更改
标签.文本后


实际上,自动布局为标签的
instriniccontentsize
创建了4个约束,但这些约束的优先级低于从
框架创建的约束,因此它们没有效果。通过禁用从
框架创建约束
,您可以为优先级较低的
instrinsicContentSize
约束提供影响
UILabel
布局的机会


您可以在标题为“内部内容大小”的部分中更详细地了解这一点。

如果标签没有严格的前导和尾随约束,可能会修剪其内容,则它是内部内容大小而不是内部内容位置保证为标签提供宽度和高度,但至少您必须提供标签x,y位置可按框架布局或自动布局,但需设置

  translatesAutoresizingMaskIntoConstraints to false

没有为对象设置框架布局或自动布局label@Sh_Khan基于,本质化。请参见清单3-5压缩阻力和内容拥抱方程。IntrinsicSize生成约束。。。即使我将
translatesAutoResizengMacintoConstraints
设置为
false
我仍然会得到相同的结果…检查布局调试器,看看它位于何处以及帧是什么。@JustinM我已经这样做了,显然帧是0,0,0,0你还没有设置任何约束。Autolayout将使用固有大小,但您仍然需要给它一些提示,标签“在(0,0)处创建宽度为0、高度为0的标签”。正确。那么居中是如何给它一个高度和宽度的呢?!对我来说,它只会改变x&y…†您对label.intrinsicContentSize的使用非常棒。我真的很喜欢。如果没有明确指定宽度和高度的约束,自动布局将使用
intrinsicContentSize
为其提供宽度和高度。否。Auto Layout的算法是:如果标签宽度和高度未使用约束指定,则使用内部内容大小。设置
label.translatesAutoResizezingMaskintoConstraints=false
将删除系统为您创建的4个约束,并使所有内容不受约束。通过指定标签的位置,iOS从
intrinsicContentSize
@Honey中计算出宽度和高度,这比我写的稍微复杂一些。系统会为intrinsicContentSize创建约束,但这些约束的优先级较低,如果它们被更高优先级的约束所压倒,则不会产生任何效果。默认情况下,从框架创建的约束具有高优先级,因此它们不会给instrinsicContentConstraints提供工作机会。通过禁用从框架创建的约束,较低优先级的intrinsicContentConstraits有机会工作。如果覆盖
viewDidLayoutSubviews
print(view.constraints.count)
print(label.constraints.count)
如果只设置
label.translatesAutoResizezingMaskintoConstraints=false,您将看到有
0
约束。但只要设置Y位置约束,这些计数就会转到
5
2
5
是4个instrinsicContentSize约束加上Y位置约束。
2
是标签宽度和高度的约束。
label.frame.size = label.intrinsicContentSize
  translatesAutoresizingMaskIntoConstraints to false