使用Masonry将自动布局约束添加到视图的子视图

时间:2015-01-28 21:10:15

标签: ios autolayout masonry-ios-osx

我正在使用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”视图被推到与屏幕齐平的左侧。奇怪的是,顶部和底部似乎尊重“测试”视图的边缘插入,并且它们准确地定位自己,但是“视图”的右边缘现在位于20点插入(因为左侧与左侧齐平)。

现在如果我改变 test2 并将其作为 self.view 的子视图,而不是的子视图测试约束突然正常。

以下是test2是测试子视图时所发生情况的可视化图片:

Everything is flushed left

这似乎意味着您只能向相同父视图的子项添加相关约束。我知道情况并非如此,但是尽管我尝试了各种不同的事情,但似乎无法让更深层的子视图影响他们的父母。

1 个答案:

答案 0 :(得分:0)

在我的例子中,事实证明问题的原因是对视图控制器的基本视图的约束。该约束原本只是将基本视图定位在全宽和高度,确实设置了宽度,高度和顶部位置,但没有左侧位置。

让左边的位置不受约束,导致未来的子视图(他们自己包含左边约束)推动父视图以符合子视图约束。

此处的教训:从视图堆栈的非常开始处开始,并在假设问题与您的子视图一起验证之前验证每个子视图。