【问题标题】:Where do NSLayoutConstraint objects live when activated with .isActive = true?使用 .isActive = true 激活时,NSLayoutConstraint 对象在哪里?
【发布时间】:2017-02-03 22:23:22
【问题描述】:

我是 Swift 新手。 在 Apple 开发教程中,我发现了以下 sn-p 代码

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

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

widthAnchorbutton 的一个计算属性,它的类型是NSLayoutDimension

constraint(equalToConstant:)NSLayoutDimension 类的一个方法,返回一个

NSLayoutConstraint 对象。

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

该对象在哪里“存活”,它与button 对象有什么关系?

谢谢

【问题讨论】:

  • 维度大概存在于堆上并被 consrint 引用

标签: ios swift autolayout nslayoutconstraint


【解决方案1】:

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 的高度相关的约束的引用添加到constraints 数组中,container 是它们的父级观点:

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)>]

【讨论】:

  • 非常感谢。是否在 NSLayoutConstraint init 中传递了对适当视图对象的引用,以便可以将视图的约束属性设置为包含 NSLayoutConstraint 引用?
  • NSLayoutConstraint init 获取对受约束控制的两个 UIView 的引用。在激活约束之前,系统不会寻找共同祖先。您可以通过首先创建两个视图,然后是约束,然后创建公共祖先,将视图添加为子视图,最后激活约束来验证这一点。这行得通。
  • 非常感谢!明白了!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2018-07-25
  • 1970-01-01
  • 2010-11-24
  • 1970-01-01
  • 1970-01-01
  • 2015-12-10
  • 2011-09-22
相关资源
最近更新 更多