使用.isActive = true激活时,NSLayoutConstraint对象在哪里生存?

时间:2017-02-03 22:23:23

标签: ios swift autolayout nslayoutconstraint

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

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

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

widthAnchorbutton计算属性,其类型为NSLayoutDimension

constraint(equalToConstant:)NSLayoutDimension类返回

的方法

NSLayoutConstraint对象。

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

该对象在哪里生活"它与button对象有什么关系?

由于

1 个答案:

答案 0 :(得分:1)

UIButtonUIView的子类,因此它具有constraints的{​​{1}}属性。

您创建的[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时,iOS会将该约束的引用添加到相应NSLayoutConstraint子类的constraints属性中。相应的视图取决于约束中两个项的关系。

UIView

第一个只是最后一个案例,但为了清楚起见,我把它留在了这里。

兄弟姐妹示例

这是一个兄弟姐妹的例子。 relationship add to ------------ ------ siblings parent of the two siblings parent/child parent single view view other first common ancestor button1button2的子视图,因此引用了将container的高度与button1相关联的约束高度被添加到button2的{​​{1}}数组中,这是他们的父视图:

constraints
container