2

我要做的事情似乎很简单,但我无法让事情说明我的期望。考虑到不同的屏幕尺寸时,我使用 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 视图时才会出现此错误。是因为我在 IB 中没有设置明确的约束吗?

因此,我根据需要将 UserView 与底部对齐,现在我想将 TableView 堆栈放在顶部并填充剩余的屏幕。如果我将上面的最后一个约束(垂直约束)替换为:

[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 会自动生成一个固定框架,而我无法用我的新约束覆盖?

4

1 回答 1

7

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

[self.view removeConstraints:self.view.constraints];
于 2013-10-21T14:31:47.257 回答