NSLayoutConstraint constraintWithItem ... ordered

时间:2015-05-05 18:26:15

标签: ios uikit autolayout nslayoutconstraint

每当我通过NSLayoutConstraint创建+constraintWithItem:attribute:relatedBy:toItem:attribute:multiplier:constant:时,我似乎总是以错误的顺序放置项目,然后我必须撤消它们。这太烦人了,在实际运行代码之前我似乎无法弄清楚它是如何产生的。例如,我希望这段代码将view 16个点放在self.view前沿的右边,这对于我来说是直观的,因为参数的顺序是:

NSLayoutConstraint *leadingMarginConstraint = [NSLayoutConstraint constraintWithItem:self.view
                                                                           attribute:NSLayoutAttributeLeading
                                                                           relatedBy:NSLayoutRelationEqual
                                                                              toItem:view
                                                                           attribute:NSLayoutAttributeLeading
                                                                          multiplier:1
                                                                            constant:16];

然而,恰恰相反。 view的前沿是self.view前沿左侧的16个点。与此相同:

NSLayoutConstraint *verticalSpacingConstraint = [NSLayoutConstraint constraintWithItem:view1
                                                          attribute:NSLayoutAttributeBottom
                                                          relatedBy:NSLayoutRelationEqual
                                                             toItem:view2
                                                          attribute:NSLayoutAttributeTop
                                                         multiplier:1
                                                           constant:16];

我希望view2的顶部比view1的底部低16点,但恰好相反。 view2的顶部比view1的底部高16点。

任何人都可以向我解释这是如何运作的吗?参数顺序的意义是什么?

谢谢!

2 个答案:

答案 0 :(得分:1)

Apple的编程指南提供了答案: https://developer.apple.com/library/ios/documentation/UserExperience/Conceptual/AutolayoutPG/AutoLayoutConcepts/AutoLayoutConcepts.html#//apple_ref/doc/uid/TP40010853-CH14-SW1

具体而言,约束表示此等式:y = m * x + b。

在哪里' x'并且' y'是视图属性,' b'是常数,而且是' m'是乘数。 ' X'并且' y'映射到您正在调用的方法中的第一个和第二个项目。因此,如果y表示视图2的顶部,则x将是视图2的高度+16。

希望这有帮助。

答案 1 :(得分:1)

您必须查看定义约束的等式。对于你的第一个例子,你所说的是,

self.view.leading = view.leading x 1 + 16

self.view.leading必须为0(根据定义),因此要使该等式起作用,视图的前沿需要为-16。