我添加约束条件到底是哪个超级视图?

假设我有3个观点

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

如果我有一个约束,涉及视图B和视图C.

文档build议增加查看C将是非法的:

约束只能包含在接收视图范围内的视图。 具体来说,涉及的任何视图必须是接收视图本身或接收视图的子视图。 据说这个视图被添加到一个视图中的约束被保留下来。 评估约束时使用的坐标系是保存约束的视图的坐标系。

  • 如果我将它添加到查看A或查看B,是否有关系?
  • join一个超级视图而不是另一个有什么意义?
  • 有什么方便的影响? (例如,如果所有的约束都在一个地方,它更容易pipe理?)

  • 如果将其添加到查看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. */