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