如何理解汽车布局约束的第一项&第二项?

时间:2015-01-27 03:58:14

标签: ios autolayout

如果我在xib中使用tableView作为View的子视图。并且tableView完全覆盖了View。但是在xib的分配器中,我可以看到刚刚添加的两个垂直约束:第一个约束使用tableView的顶部作为第一个项目,superView的顶部作为第二个项目,但在第二个约束中,它显示superview的底部是第一个项目,tableView的底部是第二个项目。是什么原因让xib决定使用谁作为第一项&第二项。

1 个答案:

答案 0 :(得分:21)

所有约束都表达了形式的公式:

firstItem.firstItemAttribute == secondItem.secondItemAttribute * multiplier + constant

(关系也可以是<=>=。)

大多数情况下,乘数是1,所以放弃:

firstItem.firstItemAttribute == secondItem.secondItemAttribute + constant

从正常数的角度来看,通常最容易思考。所以,像:

view.Top == superview.Top + 20

有道理。该观点的顶部比superview的顶部低20分。 (在自动布局使用的坐标系中,Y增加,因此添加20个点会给出位置&#34;低于&#34;。)

你可以切换项目,但是,如果你想要相同的关系,你需要否定常数:

superview.Top == view.Top + -20

那可能会让人更难理解。顺便说一句,Xcode会愉快地交换这两个项目并为你否定常数。 (如果乘数不是1,那么数学会变得有点复杂,但它仍然可能。)

如果你只是交换周围的项目而不是否定常数,它会表达不同的关系:

superview.Top == view.Top + 20

这意味着superview的顶部将低于视图的顶部。或者更确切地说,视图将位于超视图的顶部上方,并且它的顶部将被剪裁。

现在,对另一端的约束通常用另一个顺序的项表示,因为你通常希望关系是相反的。也就是说,您希望视图的顶部位于superview的顶部之下,但您希望视图的底部 超级视图的底部 。因此,只有当您按其他顺序排列项目时,常量才是正数:

superview.Bottom == view.Bottom + 20