每当我通过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点。
任何人都可以向我解释这是如何运作的吗?参数顺序的意义是什么?
谢谢!
答案 0 :(得分:1)
具体而言,约束表示此等式: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。