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... 排序的主要内容,如果未能解决你的问题,请参考以下文章