为编程视图层次结构设置自动布局约束?

Posted

技术标签:

【中文标题】为编程视图层次结构设置自动布局约束?【英文标题】:Setting up auto layout constraints for programmatic view hierarchy? 【发布时间】:2013-06-27 07:53:58 【问题描述】:

我正在像这样以编程方式创建视图层次结构:

UIWindow* window = [[UIWindow alloc] initWithFrame:[[UIScreen mainScreen] bounds]];

UIViewController1* viewController1 = [[UIViewController1 alloc] init];
UIViewController2* viewController2 = [[UIViewController2 alloc] init];

UINavigationController* navigationController = [[UINavigationController alloc] init];
[navigationController setViewControllers:@[viewController1, viewController2] animated:NO];

[window setRootViewController:navigationController];
[window makeKeyAndVisible];

这两个 VC 都是从 XIB 加载的,在这两种情况下都使用自动布局。一切看起来都不错,但是当我实际执行 po [[UIWindow keyWindow] _autolayoutTrace] 时,我会在控制台中收到一些令人担忧的 AMBIGUOUS LAYOUT 警告:

*<UIWindow:0xc63bec0>
|   *<UILayoutContainerView:0xd3d79b0> - AMBIGUOUS LAYOUT
|   |   *<UINavigationTransitionView:0xd3d8b60> - AMBIGUOUS LAYOUT
|   |   |   *<UIViewControllerWrapperView:0xd566c00> - AMBIGUOUS LAYOUT
|   |   |   |   *<UIView:0xc66b290> - AMBIGUOUS LAYOUT
|   |   |   |   |   *<UIView:0xc66b0e0> - AMBIGUOUS LAYOUT
|   |   |   |   |   |   *<MKMapView:0xd504800> - AMBIGUOUS LAYOUT

所以我的问题是,我该如何摆脱它们? 或者更笼统地说,您如何使用自动布局以编程方式设置窗口和视图层次结构?

我发现有关以编程方式设置窗口的文档非常含糊。即使我观看了所有关于此事的三个 WWDC 视频,我也无法掌握如何做到这一点。

编辑:我遇到的问题似乎只与新的 ios 7 有关。由于它处于保密协议之下,我将把这个讨论转移到指定的 Apple 开发者论坛。

【问题讨论】:

【参考方案1】:

AMBIGUOUS LAYOUT 表示您没有指定足够的 Auto Layout 来了解如何布置视图。换句话说,您指定的内容有点模糊。

这与损坏的约束完全不同,在这种情况下,您有两个或多个约束来告诉自动布局做不同的事情。

对于不明确的布局,自动布局将尝试找出您的意图。希望这将是您想要的,但不能保证。因此发出警告。

这个答案并不是告诉你如何开始的地方。但幸运的是,现在出现了更多自动布局资源。

有一本书iOS Auto Layout Demystified 。虽然我已经买了它,但我还没有机会阅读它。不过看起来确实不错。

另外,请查看 Ole Begemann 的优秀文章 10 Things You Need To Know About Cocoa Autolayout。

有关入门教程,请查看 Ray wenderlich 的 Beginning Auto Layout in iOS 6: Part 1/2。

最后,如果我可以说每次都有一个自动布局的东西让我受益,那就是忘记将setTranslatesAutoresizingMaskIntoConstraints 标志设置为NO,以便我以编程方式创建我想使用自动布局的视图。当您在控制台上看到任何看起来很奇怪的约束异常时,请记住这一点。

【讨论】:

我了解调试的一般原理和方法,但我的问题与我如何在代码中从头开始构建视图层次结构有关。我无法将我的 UIWindow 连接到它的超级视图,因为它没有。

以上是关于为编程视图层次结构设置自动布局约束?的主要内容,如果未能解决你的问题,请参考以下文章

错误:线程 1:“无法设置未准备好约束的视图层次结构的布局。”使用自动布局时

uiscrollview的自动布局,视图层次结构没有为约束做好准备

使用自动布局以编程方式创建视图层次结构

关闭模式视图控制器后,框架不反映自动布局约束

表视图的自动布局约束问题

自动布局问题