9

我正在以编程方式创建我的视图层次结构,如下所示:

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 有关。由于它在 NDA 下,我将把这个讨论转移到指定的 Apple 开发者论坛。

4

1 回答 1

1

AMBIGUOUS LAYOUT意味着您没有为自动布局指定足够的内容来了解​​如何布局您的视图。换句话说,您指定的内容有点模糊。

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

使用模棱两可的布局,自动布局将尝试找出您的意图。希望这将是您想要的,但不能保证。因此发出警告。

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

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

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

对于入门教程,请查看 Ray wenderlich在 iOS 6 中的开始自动布局:第 1/2 部分

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

于 2013-07-11T15:10:56.727 回答