添加约束的哪个superview是否重要?

时间:2013-08-11 20:39:03

标签: ios cocoa-touch autolayout nslayoutconstraint

假设我有3个观点

 A|----------|
  | B|-----| |
  |  | C ▢ | |
  |  |_____| |
  |__________|    

如果我有一个涉及视图B和视图C的约束。

documentation建议添加到视图C是非法的:

  

约束必须仅涉及接收视图范围内的视图。具体而言,涉及的任何视图必须是接收视图本身或接收视图的子视图。添加到视图的约束被认为由该视图保存。评估约束时使用的坐标系是保存约束的视图的坐标系。

  • 如果我将其添加到视图A或视图B,是否重要?
  • 添加到一个超级视图而不是另一个超级视图是否有任何影响?
  • 是否有任何便利影响? (例如,如果所有约束都在一个地方,它会更容易管理吗?)

1 个答案:

答案 0 :(得分:1)

  • 如果您将其添加到视图A或查看B,则无关紧要,只要它们符合您从文档中引用的要求即可。
  • 我没有意识到任何影响,布局是相同的。根据以下注释,约束不一定会添加到您明确添加它们的视图中。 UIView头文件(参见下面的摘录)它们通常安装在约束中涉及的视图的最近祖先(并且视图被认为是它自己的祖先)。
  • 这两种方式本身都比其他方式更方便(除非你没有引用A,在这种情况下,将它添加到B显然更方便)。它取决于你的应用程序的设置(你有什么插座/参考等)。鉴于没有安装约束你明确添加它们,这两种方式都不会更方便。我认为将它们添加到系统将最终安装它们的位置稍微有点效率。

修改

此评论来自UIView.h,上面是用于安装约束的方法:

/* A constraint is typically installed on the closest common ancestor of the views involved in the constraint. 
 It is required that a constraint be installed on _a_ common ancestor of every view involved.  The numbers in a constraint are interpreted in the coordinate system of the view it is installed on.  A view is considered to be an ancestor of itself.
 */