簡體   English   中英

將autoresizingMaskIntoConstraints轉換為不起作用

[英]translatesAutoresizingMaskIntoConstraints doesn't work

我以編程方式創建一個UIButton並將其添加到這樣的視圖中:

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啟用時,將自動生成約束並將其添加到超級視圖(在本例中為myView)。

那么,為什么這里沒有約束呢? 為什么布局系統仍然知道如何在屏幕上布局按鈕?

********更新 :我想我知道原因。 當UIView沒有附加任何約束時,Layout系統將無法安裝到位。 它將使用視圖的框架。 在這種情況下,當我們打開translatesAutoresizingMaskIntoConstraints時,不會生成按鈕的固有約束,因此該按鈕沒有任何約束。 因此將使用框架。 從代碼創建的所有UIView都將默認將transformsAutoresizingMaskIntoConstraints轉換為YES,因此不會自動為視圖生成約束。 框架將被使用。 對於向后兼容,這是很有意義的。

該文檔描述其行為如下:

如果translatesAutoresizingMaskIntoConstraints = YES ,則視圖的超級視圖將查看視圖的自動調整蒙版,生成實現該約束的約束,並將這些約束添加到自身(超級視圖)。

根據此描述,應該可以在[UIView約束]數組中查找轉換后的約束,但是不會在此處添加生成的約束(當您以編程方式創建視圖時(如果將視圖添加到nib中,則只有將獲得預期的行為)。

經過調試器的仔細研究后,我確定約束是在布局期間通過專用方法‑[UIView(UIConstraintBasedLayout) _constraintsEquivalentToAutoresizingMask]

要查看約束,請創建UIView的類別

@interface UIView(TestConstriants)

- (NSArray *)_constraintsEquivalentToAutoresizingMask;

@end

將此類別導入您的ViewController類#import "UIView+TestConstriants.h"

調用以下代碼行,然后添加self.button進行查看

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

上面記錄了等同於autoResize掩碼的約束。 嘗試通過將autoresizingMask設置為不同的值進行測試,您將獲得相應的等效約束。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM