2013-01-02 20 views
0

我打算使用界面生成器为iPad设计一个屏幕。我有一个空的视图和我加入的UIImageView作为壁纸用4个约束:用于iPad的几乎空UIView上的模糊布局

Leading Space to superview = 0 
Trailing Space to superview = 0; 
Top Space to superview = 0; 
Bottom Space to superview = 0; 

以这种方式,图像在横向模式下完全调整大小。

我插在viewDidAppear一些调试代码:和didRotateFromInterfaceOrientation:

NSLog(@"%@", [[UIWindow keyWindow] _autolayoutTrace]); 

只有屏幕,我得到在纵向模式下的ambigous布局输出这个元素:

*<UIWindow:0x754c210> 
| *<UIView:0x75555f0> - AMBIGUOUS LAYOUT 
| | *<UIImageView:0x7555650> - AMBIGUOUS LAYOUT 

在横向模式下,似乎工作正常

*<UIWindow:0x754c210> 
| *<UIView:0x75555f0> 
| | *<UIImageView:0x7555650> 

之后,我的广告代码更多的控制和屏幕似乎工作正常,但我无法摆脱那种模糊的布局。 我做错了什么?

回答

0

我不知道,如果你做错了什么,但我使用Visual格式化语言:

[NSLayoutConstraint constraintsWithVisualFormat:@"V:|[contentsView]|" 
              options:0 
              metrics:nil 
               views:NSDictionaryOfVariableBindings(contentsView)]]; 

[NSLayoutConstraint constraintsWithVisualFormat:@"H:|[contentsView]|" 
              options:0 
              metrics:nil 
               views:NSDictionaryOfVariableBindings(contentsView)]]; 

我没有看到追踪任何ambigous布局警告。

1

我想有时需要时间来约束“安定下来”,而不是模棱两可。根据WWDC 2012视频“掌握自动布局的最佳实践”,模糊可以暂时容忍(与不可满足性,立即引发异常)。

如果你想证明自己,你的约束不剩下的暧昧,然后创建[的UIWindow keyWindow] _autolayoutTrace]的包装,并在短暂的延迟后调用它:

- (void)viewDidAppear:animated 
{ 
    [super viewDidAppear:animated]; 

    [self performSelector:@selector(wrapperForLoggingConstraints) withObject:nil afterDelay:.3]; 
} 

- (void)wrapperForLoggingConstraints 
{ 
    [[UIWindow keyWindow] _autolayoutTrace]; 
} 

你必须创建为了得到一个UIWindow上一类这样的工作:

@interface UIWindow() 

+ (UIWindow *)keyWindow; 
- (NSString *)_autolayoutTrace; 

@end 

我把这一类在其自己的头文件,UIWindow_AutoLayoutDebug.h

在哪里曾经我叫[一个UIWindow keyWindow] _autolayoutTrace]在我的应用程序,我输入UIWindow_AutoLayoutDebug.h

我了解从书 “的iOS 6的教程” 呼叫[一个UIWindow keyWindow] _autolayoutTrace]在代码中,第1卷,由raywenderlich.com团队。推迟电话的想法是我自己的。

+0

您只能在lldb会话中调用_autolayoutTrace。它不会像上面所写的那样编译。你可以调用UIView方法'hasAmbiguousLayout',但是这会告诉你一个单一的视图,而不是它的后代。要做到这一点,人们可以编写一个方法缓存所有子视图,并在每个子视图上调用hasAmbiguousLayout。请记住,仅适用于开发时间,不适用于运输代码。 – idStar