如何检索约束的值?

How do I retrive the value of a constraint?

我有一个NSLayoutConstraint约束:

var myConstantLeading: CGFloat = 10
var myConstantTrailing: CGFloat = 10

var myConstraintLeading = NSLayoutConstraint (item: image,
        attribute: NSLayoutAttribute.Leading,
        relatedBy: NSLayoutRelation.Equal,
        toItem: self.view,
        attribute: NSLayoutAttribute.Leading,
        multiplier: 1,
        constant: myConstantLeading)
    self.view.addConstraint(myConstraintLeading)

var myConstraintTrailing = NSLayoutConstraint (item: image,
        attribute: NSLayoutAttribute.Trailing,
        relatedBy: NSLayoutRelation.Equal,
        toItem: self.view,
        attribute: NSLayoutAttribute.Trailing,
        multiplier: 1,
        constant: myConstantTrailing)
    self.view.addConstraint(myConstraintTrailing)

按下 UIButton 时,image 会缩放:

self.image.transform = CGAffineTransformMakeScale(0.8, 0.8)

尽管在转换完成后,constant 没有改变:

println(myConstraint.constant) // equals to 10
println(myConstant) // equals to 10

我调整了图像的大小,因此 constant 应该有所不同。为什么没有发生这种情况?

如果您查看 UIView Class 参考 transform property,您会看到一条警告:

If this property is not the identity transform, the value of the frame property is undefined and therefore should be ignored.

并且由于您的视图变换 属性 不是恒等变换并且其框架未定义,因此也应忽略其所有约束常量,因为它们与视图的框架相关联

您设置的约束都使用 "Equal" 关系,并且两侧的常数为 10pt。如果您在不调整约束的情况下更改图像大小,则您违反了约束要求并且布局不明确。

如果您想观察常量值的变化,则需要允许它们发生变化。您必须将 "Equal" 更改为 "Greater Than Or Equal",以便允许约束与其当前的 10pt 值不同。这当然假设图像只能缩小——它离边缘的距离永远不会超过 10pt,但它可以更小。

您还需要明确定义在转换图像后您希望布局发生什么。如果您希望图像在按钮后保持居中 tap/resize,理想情况下您只需向图像添加一个约束,使其在容器中水平居中。

仅将“=”调整为“>=”仍然会产生歧义,因为系统不知道图像应该从左到右多远,也不知道图像的宽度是多少。你需要给它更多的信息,比如 "center horizontally in container" AND "leading & trailing edges >= 10pt from the superview"。