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

时间:2015-06-02 02:47:34

标签: ios objective-c nslayoutconstraint

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

scrollContainerView作为view内的子视图。

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]]

1 个答案:

答案 0 :(得分:1)

必须将约束添加到视图中,该视图是约束中涉及的所有视图的祖先,其中视图被视为"祖先"本身。他们不必被添加到最近的祖先,尽管这是最常见的。

因此,对于您的第一个问题,编写该代码的人决定如何做到这一点。不清楚为什么他们做出了这个决定。

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

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