2013-01-02 24 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