NSLayoutConstraint constraintWithItem... 排序

Posted

技术标签:

【中文标题】NSLayoutConstraint constraintWithItem... 排序【英文标题】:NSLayoutConstraint constraintWithItem... ordering 【发布时间】:2015-05-05 18:26:15 【问题描述】:

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

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 点。

谁能向我解释这是如何工作的?参数顺序的意义是什么?

谢谢!

【问题讨论】:

【参考方案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。

希望这会有所帮助。

【讨论】:

【参考方案2】:

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

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

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

【讨论】:

以上是关于NSLayoutConstraint constraintWithItem... 排序的主要内容,如果未能解决你的问题,请参考以下文章

如何检查 NSLayoutConstraint 是不是动画

如何创建返回 NSLayoutConstraint 的函数

NSLayoutConstraint 设置优先级

错误的 NSLayoutConstraint 导致黑屏

无法获取 NSLayoutConstraint 的约束

更改 NSLayoutConstraint 的常量