對此,很難找到確切的文檔或其他參考。看Florian Kugler's頁面Advanced Auto Layout Toolbox有一些很好的信息。正如我認爲這是一個有趣的問題,我做了一些挖掘。
我設置了一個UIButton
myButton
設置在廈門國際銀行和一些空間限制網點的測試項目:
@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](https://i.stack.imgur.com/7RxXQ.png)
控制檯上沒有任何東西。這讓我很吃驚,因爲我習慣了自動佈局,在出現問題的第一個跡象時就揮霍了大量的約束例外。
調查認爲,一個快速search here on SO透露,
「歧義可以暫時容忍的(不像不可滿足, 這立即引發了異常)」
這樣解釋清楚控制檯,在至少現在。
總而言之,我相信到viewDidLoad
執行時,測量,佈局和顯示過程已經發生。去除約束然後呈現視圖不明確。自動佈局然後做了常識的事情,認爲它不再知道如何佈局; 沒有什麼。視圖保持原位。
我應該補充說,旋轉模擬器也沒有任何區別,按鈕的框架保持不變。沒有隱晦的佈局例外。 – Aky
我猜幀已經計算在viewDidLoad之前,甚至在刪除約束之後,Autolayout以某種方式繼續使用相同的幀? – Aky