NSLayoutConstraint constraintWithItem ...排序

NSLayoutConstraint constraintWithItem... ordering

每当我通过 +constraintWithItem:attribute:relatedBy:toItem:attribute:multiplier:constant: 创建一个 NSLayoutConstraint 时,我似乎总是以错误的顺序结束项目,然后我必须颠倒它们。这太烦人了,我似乎想不出任何方法可以在实际 运行 代码之前告诉它结果如何。例如,我希望这段代码将 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 点。

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

谢谢!

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.

希望对您有所帮助。

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

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

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