2012-12-09 24 views
1

在與視圖控制器視圖對應的XIB文件中,Autolayout打開後,我拖出一個按鈕並將其放置在任意位置,以便Interface Builder自動生成按鈕與其超級視圖之間的垂直和水平間距約束(即VC的觀點)。在視圖控制器.m文件中,我創建了IBOutlets以適應這兩個約束,並在viewDidLoad方法中,將它們從VC的視圖[self.view removeConstraint:self.vConstraint]等中刪除(並且不,我沒有忘記使插座連接)爲什麼移除這些約束不會導致佈局異常?

運行該應用程序,我期望Xcode(版本4.5.1,如果有問題的話)會抱怨佈局是模糊的,但令人驚訝的是(對我而言),事實並非如此。

那麼按鈕框架的原點是如何計算的?該按鈕確實出現在它的超級視圖中的位置,它在Interface Builder中放置的位置,但我想知道Autolayout在這種情況下究竟做了什麼(最好是參考官方文檔)。

+0

我應該補充說,旋轉模擬器也沒有任何區別,按鈕的框架保持不變。沒有隱晦的佈局例外。 – Aky

+0

我猜幀已經計算在viewDidLoad之前,甚至在刪除約束之後,Autolayout以某種方式繼續使用相同的幀? – Aky

回答

1

對此,很難找到確切的文檔或其他參考。看Florian Kugler's頁面Advanced Auto Layout Toolbox有一些很好的信息。正如我認爲這是一個有趣的問題,我做了一些挖掘。

我設置了一個UIButtonmyButton設置在廈門國際銀行和一些空間限制網點的測試項目:

@property (weak, nonatomic) IBOutlet NSLayoutConstraint *hSpaceConstraint; 
@property (weak, nonatomic) IBOutlet NSLayoutConstraint *vSpaceConstraint; 

正如你所說,在viewDidLoad消除這些限制沒有任何影響。即使在viewDidLoad中刪除約束後立即輸出[self.myButton hasAmbiguousLayout]顯示false。

但是,通過viewDidAppear,情況發生了變化。 myButton被正確標記爲不明確雙方hasAmbiguousLayout並且還通過在LLDB做一個自動佈局跡:

(lldb) po [[UIWindow keyWindow] _autolayoutTrace] 

*<UIWindow:0x8a94fe0> - AMBIGUOUS LAYOUT 
| *<UIView:0x8c55340> 
| | *<UIRoundedRectButton:0x8c54100> - AMBIGUOUS LAYOUT 
| | | <UIImageView:0x8c54580> 
| | | <UIButtonLabel:0x8c595a0> 
(lldb) 

在這個階段,我們還可以鍛鍊歧義:

- (void)viewDidAppear:(BOOL)animated { 
    [super viewDidAppear:animated]; 
    [self.myButton exerciseAmbiguityInLayout]; 
} 

沒有鍛鍊: enter image description here 鍛鍊: enter image description here

控制檯上沒有任何東西。這讓我很吃驚,因爲我習慣了自動佈局,在出現問題的第一個跡象時就揮霍了大量的約束例外。

調查認爲,一個快速search here on SO透露,

「歧義可以暫時容忍的(不像不可滿足, 這立即引發了異常)」

這樣解釋清楚控制檯,在至少現在。

總而言之,我相信到viewDidLoad執行時,測量,佈局和顯示過程已經發生。去除約束然後呈現視圖不明確。自動佈局然後做了常識的事情,認爲它不再知道如何佈局; 沒有什麼。視圖保持原位。

相關問題