2014-06-25 39 views
1

我編程方式創建一個UIButton並將其添加到這樣一個觀點:translatesAutoresizingMaskIntoConstraints不起作用

self.button = [[UIButton alloc] initWithFrame:CGRectMake(20, 20, 100, 30)]; 
[self.button setTitle:@"Test" forState:UIControlStateNormal]; 
self.button.translatesAutoresizingMaskIntoConstraints = YES; 
[myView addSubview:self.button]; 

按鈕顯示正確,因爲translatesAutoresizingMaskIntoConstraints是它不使用其固有大小(這是正確的上)。但是,當我打印出myView.constraints,我沒有看到任何關於按鈕的約束。根據定義,當translatesAutoresizingMaskIntoConstraints開啓時,約束將自動生成並添加到superview,在這種情況下,它是myView。

那麼爲什麼這裏沒有約束呢?爲什麼佈局系統仍然知道如何在屏幕上佈置按鈕?

********更新: 我想我知道原因。 當UIView沒有附加任何約束時,佈局系統不會到位。它將使用視圖的框架。 在這種情況下,當我們打開translatesAutoresizingMaskIntoConstraints時,不會生成按鈕的內部約束,因此該按鈕沒有任何約束。所以框架將被使用。 從代碼創建的所有UIView都將translatesAutoresizingMaskIntoConstraints默認爲YES,因此不會爲視圖自動生成約束。該框架將被使用。這對於向後兼容性非常有意義。

+0

你有哪些其他視圖使用自動佈局? – Wain

+0

主視圖從使用AutoLayout的筆尖加載。 – namanhams

回答

2

該文檔描述如下它的行爲:

如果translatesAutoresizingMaskIntoConstraints = YES,視圖的上海華着眼於視圖的面罩自動調整大小,產生了實現它的限制,並增加了這些約束本身(上海華)。

基於此描述,預計能夠查看 - [UIView約束]數組來查找已轉換的約束,但不會在那裏添加已生成的約束當您以編程方式創建視圖時(如果添加了視圖然後只有我們會得到預期的行爲)。

經過與調試器的一些仔細的探索後,我確定約束是在私人方法‑[UIView(UIConstraintBasedLayout) _constraintsEquivalentToAutoresizingMask]佈局期間根據需要生成的。

要查看約束創建的UIView

@interface UIView(TestConstriants) 

- (NSArray *)_constraintsEquivalentToAutoresizingMask; 

@end 

進口這一類的範疇你的ViewController類的#import "UIView+TestConstriants.h"

調用這個代碼行ofter加入self.button查看

NSLog(@"constraints: %@", [self.button _constraintsEquivalentToAutoresizingMask]); 

以上記錄等效於autoResize掩碼的約束。 嘗試通過將autoresizingMask設置爲不同的值,您將獲得相應的等效約束。

+0

實際上沒有爲按鈕生成約束。請參閱我的第一篇文章更新說明。 – namanhams

+0

但是,如果View是自動佈局啓用,它總是會爲其子視圖生成約束。 –

+0

它沒有。只有當視圖已經有一個約束(或者通過添加約束或者視圖具有固有尺寸並且translatesAutoresizingMaskIntoConstraints = NO),否則不會爲其生成約束,而忽略其超視圖。這是爲了向後兼容。假設你使用了一個在你的項目中有一個自定義UIView的非自動佈局庫。除非您明確要求,否則不會爲該視圖生成約束。 – namanhams