我正在使用 Masonry iOS 库来简化围绕 iOS 自动布局的一些逻辑,并且到目前为止我很喜欢它。不过,就在最近,我正在开发一个更复杂的应用程序,并尝试将自动布局约束添加到与其父视图相关的子视图中。然而,这样做似乎会迫使父视图采用其子视图的约束。可能我只是没有完全理解自动布局继承的这一方面,但这里有一个简单的例子:
UIView *test = UIView.new;
[test setBackgroundColor:[UIColor orangeColor]];
[self.view addSubview:test];
[test makeConstraints:^(MASConstraintMaker *make) {
make.edges.equalTo(self.view).with.insets(UIEdgeInsetsMake(10, 10, 10, 10));
}];
UIView *test2 = UIView.new;
[test2 setBackgroundColor:[UIColor redColor]];
[test addSubview:test2];
[test2 makeConstraints:^(MASConstraintMaker *make) {
make.edges.equalTo(test).with.insets(UIEdgeInsetsMake(5, 5, 5, 5));
make.centerX.equalTo(test);
}];
在这个例子中,尽管第二个 UIView (test2) 是 test 的子视图并且它的边缘设置为匹配 test,但当这个代码运行时,“test”视图被推到与屏幕齐平。奇怪的是,顶部和底部似乎尊重“测试”视图的边缘插图,并且它们准确定位自己,但是“视图”的右边缘现在位于 20 点插图处(因为左侧与左侧齐平)。
现在,如果我更改test2并使其成为self.view的子视图 而不是test的子视图,则约束突然可以正常工作。
这是当 test2 是 test 的子视图时发生的情况的直观图片:
这似乎意味着您只能将相关约束添加到同一父视图的子视图。我知道这不可能,但尽管尝试了各种不同的事情,但我似乎无法阻止更深层次的子观点影响他们的父母。