当使用 .isActive = true 激活时,NSLayoutConstraint 对象位于何处?

Where do NSLayoutConstraint objects live when activated with .isActive = true?

我是 Swift 的新手。 在 Apple 开发教程中,我发现了以下代码片段

let button = UIButton() 
button.widthAnchor.constraint(equalToConstant:44.0).isActive = true

有人可以帮助我了解后一行发生了什么吗?

widthAnchor 计算的 属性button,它的类型是 NSLayoutDimension.

constraint(equalToConstant:)NSLayoutDimension class 返回一个

的方法

NSLayoutConstraint 对象。

因此....isActive = true将后一个对象的isActive属性设置为true.

那个对象 "live" 在哪里,它与 button 对象有什么关系?

谢谢

UIButtonUIView 的子类,因此它有一个 constraints 属性 即 [NSLayoutConstraint].

您创建的 NSLayoutConstraint 是一个对象(因此它被分配在堆上)并且对它的引用被添加到按钮本身的 constraints 属性 中:

let button = UIButton()

print(button.constraints)
[]  // empty array
button.widthAnchor.constraint(equalToConstant:44.0).isActive = true

print(button.constraints)
[<NSLayoutConstraint:0x6000000926b0 UIButton:0x7fbe6ff01940.width == 44   (active)>]

一个 NSLayoutConstraint 最多与两个项目(视图)相关。 当您激活 NSLayoutConstraint 时,iOS 将对该约束的引用添加到适当 UIView 子类的 constraints 属性。合适的视图取决于约束中两个项目的关系。

relationship          add to
------------          ------
siblings              parent of the two siblings
parent/child          parent
single view           view
other                 first common ancestor

第一个只是最后一个的特例,但为了清楚起见,我将其留在这里。


兄弟姐妹例子

这是一个兄弟姐妹的例子。 button1button2container 的子视图,因此将 button1 的高度与 button2 的高度相关的约束的引用添加到 [= container 的 19=] 数组是它们的父视图:

let button1 = UIButton()
let button2 = UIButton()
let container = UIView()

container.addSubview(button1)
container.addSubview(button2)

button1.heightAnchor.constraint(equalTo: button2.heightAnchor, multiplier: 2).isActive = true

print(container.constraints)
[<NSLayoutConstraint:0x60800008ef10 UIButton:0x7f9ec7c03740.height == 2*UIButton:0x7f9ec7d06f90.height   (active)>]