ios - 嵌入 ViewController 时, View 未按预期使用 AutoLayout 进行布局

标签 ios objective-c interface-builder autolayout

我想要的东西看起来很简单,但我无法得到符合我期望的东西。考虑到不同的屏幕尺寸时,我正在使用 AutoLayout 来避免对框架进行硬编码。 AutoLayout 为所有 .xibs 打开,但我没有在 Interface Builder 中创建任何明确的约束。

ViewControllerA 正在嵌入 ViewControllerB 并将 VCB 的 View 添加到它的 View 层次结构中。 VCA 有一个 TableView,而 VCB 有一个 UserView(只是一个带有 subview 的普通 View )。

我希望 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 View 时才会出现此错误。是因为我没有在 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 会自动生成一个固定框架,而我无法用我的新约束覆盖这个框架?

最佳答案

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

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

关于ios - 嵌入 ViewController 时, View 未按预期使用 AutoLayout 进行布局,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17870966/

相关文章:

iphone - 如何更新 MKPolyline/MKPolylineView?

iphone - 来自 xib 的自定义 UITableViewCell 显示不正确

ios - UISegmentController 与 UITableviewController

ios - 使用 slider 更改图像的对比度和亮度

ios - 在 IOS 上将 CoreGraphics 渲染为 OpenGL 纹理

ios - 如何使用自动布局垂直堆叠 TableView ?

ios - uikit 方法是否保证在主线程上运行?

Objective-C NSData initWithContentsOfFile,检查文件是否存在?

ios - 是否可以在 Interface Builder 中使用自动布局定位 View ,以便如果标签为空,其他 View 将不会保留空间?

ios - Xcode ScrollView 不起作用