如何检索约束的值?

时间:2015-02-20 16:43:06

标签: ios swift nslayoutconstraint

我有一个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应该会有所不同。为什么不发生这种情况?

2 个答案:

答案 0 :(得分:1)

您设置的限制都使用" Equal"与任何一方持续10pt的关系。如果您在不调整约束的情况下更改图像大小,则违反了约束要求&有一个模糊的布局。

如果您想观察常数值的变化,则需要允许更改。你必须改变" Equal"到"大于或等于"因此允许约束与其当前的10pt值不同。这当然假设图像只能缩小 - 它永远不会远离边缘大于10pt,但它可能更小。

您还需要在转换图像后清楚地定义您希望在布局中发生什么。如果您希望图像在按钮点击/调整大小后保持居中,则理想情况下只需向图像添加约束以使其在容器中水平居中。

仅调整" ="到"> ="仍然是模棱两可的,因为系统不知道图像应该离左或右多远,也不知道图像宽度是多少。您需要向其提供更多信息,例如"水平居中容器" AND"领先&尾部> = 10pt来自superview"。

答案 1 :(得分:0)

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

  

如果此属性不是identity变换,则frame属性的值是未定义的,因此应该被忽略。

并且由于您的视图转换属性不是标识转换且其框架未定义,因此它的所有约束常量也应该被忽略,因为它们与视图的框架链接