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

时间:2013-06-27 07:53:58

标签: ios uikit autolayout uiview-hierarchy

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

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加载的,在这两种情况下都使用autolayout。一切看起来都不错,但当我实际做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 Developer Forums。

1 个答案:

答案 0 :(得分:1)

AMBIGUOUS LAYOUT表示您没有为Auto 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,以便我以编程方式创建我想要使用的视图布局。当你在控制台上看到任何看起来很糟糕的约束异常时,请记住这一点。