簡體   English   中英

如何使用Auto Layout在Interface Builder中創建的現有視圖中添加視圖?

[英]How to add views in an existing view made in Interface Builder with Auto Layout?

我在Interface Builder中創建了以下自動布局:

在此處輸入圖片說明

如您所見,我沒有為按鈕提供任何固定大小。 我想以編程方式添加兩個按鈕以獲得以下結果:

在此處輸入圖片說明

以編程方式添加約束,我知道該怎么做,至少我知道語法。

我的問題是何時創建這些按鈕?

我基於按鈕4的寬度創建寬度約束。如果在viewDidLoad中執行寬度約束(如果我沒有記錯的話),則尚未設置自動布局,因此寬度(和高度)將是錯誤的。

我本想在viewDidLayoutSubviews中執行此操作,但是由於在加載viewController時多次調用它,所以我將多個按鈕堆疊在一起,而當我進入橫向時,會添加更多按鈕。

我應何時創建這些按鈕以具有合適的尺寸?

您可以在viewDidLoad以編程方式創建約束。 如果為按鈕制作了IBOutlet ,則可以訪問它們並獲得如下尺寸:

self.myButton.frame.size.height;

您可以使用“自動布局約束”工具來簡化此過程。

自動布局是關於始終保持規則的規則,而不是(主要)關於任何時刻的幀大小。

設置按鈕5和6的約束時,您不必關心獲取按鈕4的框架。為按鈕5和6添加的約束應參考按鈕4的width屬性,而不是其當前的寬度(以磅為單位)。 也就是說,您可以創建如下約束:

NSLayoutConstraint* constraint = [NSLayoutConstraint constraintWithItem:button5 attribute:NSLayoutAttributeWidth relatedBy:NSLayoutRelationEqual toItem:button4 attribute:NSLayoutAttributeWidth multiplier:1 constant:0];
constraint.active = YES; // OR: [button5.superview addConstraint:constraint]

這是一個約束,即使按鈕4的寬度發生變化,也將使按鈕5的寬度與按鈕4的寬度相同。 您將對高度和按鈕6進行相同的操作。

換句話說,如果在設計時執行此約束,則在運行時創建的約束應類似於在IB中創建的約束。 在我看來,您似乎並沒有在按鈕4上創建明確的,固定的高度和寬度約束。您已經創建了將其高度和寬度與其他視圖相關聯的相對約束。

您將要做的一件事:由於按鈕2和4對容器(或其邊緣)具有尾隨的空間約束,因此在添加按鈕5和6時需要刪除這些約束。按鈕2和4必須具有尾隨的空間。分別對按鈕5和6進行約束,而按鈕5和6必須對容器具有尾隨約束。 實際上,您應該簡化操作,方法是擺脫對容器的按鈕4的尾隨約束,並用對按鈕2的尾隨對齊約束替換它。同樣,按鈕6的尾隨邊緣應與按鈕5的尾部對齊,且與超級視圖之間的距離不要隔開。 這樣,您只需刪除一個約束(按鈕2的尾部到超級視圖)並添加一個約束(按鈕5的尾部到超級視圖)。

暫無
暫無

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

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