簡體   English   中英

iOS:UIButton自動版式大小為零

[英]iOS: UIButton Autolayout size is zero

使用自動布局,我想了解為什么會發生以下情況:創建一個簡單的UIButton並設置其標題。 但是,即使我希望設置視圖的固有內容大小並因此正確獲取其框架,該按鈕的框架也會顯示(0,0,0,0)。 我該怎么做才能獲取按鈕的幀值?

-(void)viewDidLoad {

    [super viewDidLoad];

    UIButton *button = [[UIButton alloc] init];

    [button.titleLabel setText:@"My button"];

    //button frame is zero

}

但是,如果我要這樣做,那么事情將會按預期進行:

-(void)viewDidLoad {

    [super viewDidLoad];

    UILabel *label = [[UILabel alloc] init];

    [label setText:@"My label"];

    [label sizeToFit];

    //label frame has the expected width and height

}

自動布局僅在布局通過后才設置視圖框架,這是一個循環的過程,不會在每次添加視圖或修改約束時被調用,這就是為什么有時需要在特定視圖上調用-setNeedsLayout的原因。
另一點是,如果你沒有創建使用Interface Builder或以編程的限制,自動布局自動視圖自動尺寸口罩轉換成約束( -translatesAutoresizingMaskIntoConstraints屬性)。
在這種情況下,如果設置文本,則將強制視圖表達其內在內容的大小,該大小基本上是標簽的大小,如果內在內容的大小不與它贏得的其他約束沖突,但是您只能問布局通過后的按鈕大小。 在對超類調用相同方法后,嘗試檢查.viewDidLayout的按鈕大小

- (void)viewDidLoad {
    [super viewDidLoad];

    UIButton *button = [UIButton buttonWithType:UIButtonTypeSystem];
    button.translatesAutoresizingMaskIntoConstraints = NO;
    [button setTitle:@"My button" forState:UIControlStateNormal];
    [self.view addSubview:button];
}

- (void)viewDidLayoutSubviews {
    //check frame of button
}

就像@Andrea所說的:因為您沒有在IB中添加按鈕,所以默認情況下使用autoResizingMask,它將保留按鈕初始化時使用的零尺寸框架。

如果要使用自動版式,則需要設置

button.translatesAutoresizingMaskIntoConstraints = NO;

就在調用-addSubview:之前。

另外,您必須添加至少1個水平約束和1個垂直約束來放置按鈕。 即使執行了此操作,也僅在下一次布局通過之后設置按鈕的框架,您可以通過調用-layoutIfNeeded手動啟動-layoutIfNeeded

將按鈕添加為子視圖,然后在子視圖上調用layoutIfNeeded 之后訪問其框架。

還要確保您添加了前導和頂部約束,以將按鈕定位在其父視圖內。

暫無
暫無

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

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