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