在嵌入ViewController时,视图没有按预期使用AutoLayout进行布局

时间:2013-07-26 00:25:11

标签: ios objective-c interface-builder autolayout

我想要的东西看起来很简单,但我无法弄清楚我的期望。考虑到不同的屏幕尺寸,我正在使用AutoLayout来避免硬编码帧。为所有.xib打开了AutoLayout,但我没有在Interface Builder中创建任何显式约束。

ViewControllerA嵌入了ViewControllerB并将VCB的视图添加到它的视图层次结构中。 VCA有一个TableView,VCB有一个UserView(只是带有子视图的普通视图)。

我希望TableView位于UserView的顶部。 UserView具有固定的高度,它的底部将始终固定在屏幕的底部。 TableView将填充屏幕的其余部分。

这是我在代码中所拥有的。这会成功将UserView粘贴到底部:

userViewController.view.translatesAutoresizingMaskIntoConstraints = false;
NSDictionary *constrainedViews = @{ @"userView" : userViewController.view, @"menu" : self.menuTable };
[self.view addConstraints:[NSLayoutConstraint constraintsWithVisualFormat:@"H:|[userView]|"
                                                                  options:0
                                                                  metrics:nil
                                                                    views:constrainedViews]];
[self.view addConstraints:[NSLayoutConstraint constraintsWithVisualFormat:@"V:[userView(174)]|"
                                                                  options:0
                                                                  metrics:nil
                                                                    views:constrainedViews]];

1)如果我在添加约束之前没有调用translatesAutoresizingMaskIntoConstraints,我会得到“无法同时满足约束”。在我的控制台抱怨有冲突的NSAutoresizingMaskLayoutConstraints。为什么?我打开了AutoLayout。我认为只有在组合AutoLayout和非AutoLayout视图时才会出现此错误。是因为我没有在IB中设置明确的约束吗?

所以我根据需要将UserView对齐到底部,现在我想要将TableView堆栈放在最上面并填充剩余的screen.If我用上面的替换上面的最后一个约束(Vertical约束):< / p>

[self.view addConstraints:[NSLayoutConstraint constraintsWithVisualFormat:@"V:|[menu][userView(174)]|"
                                                                  options:0
                                                                  metrics:nil
                                                                    views:constrainedViews]];

我再次在控制台中收到一堆错误。

(
"<NSLayoutConstraint:0xd39c880 'IB auto generated at build time for view with fixed frame' V:|-(0)-[UITableView:0xe914e00]   (Names: '|':UIView:0xd39ea60 )>",
"<NSLayoutConstraint:0xd39c590 'IB auto generated at build time for view with fixed frame' V:[UITableView:0xe914e00(362)]>",
"<NSLayoutConstraint:0xd3a4f60 V:[UITableView:0xe914e00]-(0)-[UIView:0xd39ff60]>",
"<NSLayoutConstraint:0xd3a4350 V:[UIView:0xd39ff60]-(0)-|   (Names: '|':UIView:0xd39ea60 )>",
"<NSAutoresizingMaskLayoutConstraint:0xd3af6d0 h=-&- v=-&- UIView:0xd39ff60.midY == UIView:0xd39ea60.midY>"
)

我已经被困了好几个小时,并且不知道如何继续。我有什么想法我做错了吗?为什么IB自动生成一个固定的帧,而我无法用我的新约束覆盖它?

1 个答案:

答案 0 :(得分:7)

看起来破坏的约束在你的superview或包含UITableView的视图上,而不是在UITableView本身上。如果您计划在代码中设置这些约束,则应首先删除所有这些自动约束:

[self.view removeConstraints:self.view.constraints];