在不相关的视图对象上调用 addConstraint 方法

addConstraint method being called on unrelated view object

我一直在网上阅读一些代码,这就是它的设置方式 -

A scrollContainerView 作为我的 view 中的子视图。

A scrollView 作为 scrollContainerView.

中的子视图
[self.view addConstraints: [NSLayoutConstraint constraintsWithVisualFormat:@"V:|[scrollView]|"options:0 metrics:nil views:viewDictionary]]

现在根据视觉格式,scrollView 被垂直固定在其父视图的顶部和底部边缘,父视图是 scrollContainerView

QN 1 -

我很困惑为什么要将结果约束添加到 self.view 而不是 scrollview。为什么约束添加到 self.view 而它与添加的约束无关。

QN 2 -

假设我有一个名为 viewOuter 的父视图及其名为 viewInner 的子视图。那么 -

之间有什么区别吗?
[viewOuter addConstraint:[NSLayoutConstraint constraintWithItem:viewInner attribute:NSLayoutAttributeLeading relatedBy:NSLayoutRelationEqual toItem:viewOuter attribute:NSLayoutAttributeLeading multiplier:1.0 constant:0.0]]

[viewInner addConstraint:[NSLayoutConstraint constraintWithItem:viewInner attribute:NSLayoutAttributeLeading relatedBy:NSLayoutRelationEqual toItem:viewOuter attribute:NSLayoutAttributeLeading multiplier:1.0 constant:0.0]]

必须将约束添加到一个视图,该视图是约束中涉及的所有视图的祖先,其中一个视图被认为是其自身的 "ancestor"。不必将它们添加到 最近的 祖先,尽管这是最常见的做法。

因此,对于您的第一个问题,这就是编写该代码的人决定这样做的方式。不清楚他们为什么做出那个决定。

对于你的第二个问题,只允许使用第一种形式。第二个无效,因为接收者不是约束中涉及的所有视图的祖先。

最后,我想说的是,在 iOS 8.0 或更高版本中,您只需在约束上设置 active 属性,它就会自动添加或删除自身相关观点。同样,您可以执行 [NSLayoutConstraint activateConstraints:constraints][NSLayoutConstraint deactivateConstraints:constraints] 来批量添加或删除约束,而不必弄清楚应该在哪些视图中添加或删除它们。