addSubview 如何与 intrinsicSizes 一起使用?
How does addSubview work with 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
}()
}
这个:
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's Auto Layout Guide 标题为 内在内容大小 的部分阅读更多详细信息。
它是内在内容大小而不是内在内容位置保证为标签提供宽度和高度如果它不是严格地具有前导和尾随约束可能trim它是内容,但至少你必须给标签x,y 位置可以通过框架布局或自动布局设置
translatesAutoresizingMaskIntoConstraints to false
以下代码的结果是:我没有看到标签。
我的理解是标签的 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
}()
}
这个:
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's Auto Layout Guide 标题为 内在内容大小 的部分阅读更多详细信息。
它是内在内容大小而不是内在内容位置保证为标签提供宽度和高度如果它不是严格地具有前导和尾随约束可能trim它是内容,但至少你必须给标签x,y 位置可以通过框架布局或自动布局设置
translatesAutoresizingMaskIntoConstraints to false