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

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保护,所以我将把这个讨论移到指定的苹果开发者论坛。
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。当您在控制台上看到任何奇怪的约束异常时,请将其记在心中。


我理解调试的一般哲学和方法,但我的问题涉及如何从头开始在代码中构建视图层次结构。由于它没有任何超级视图,因此我无法将我的UIWindow连接到它。 - ABeanSits

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接