Auto Layout 和 Constraints
來自: http://segmentfault.com/a/1190000004386278
自動布局Auto Layout
Auto Layout通過通過設置在View上的約束,動態計算視圖層次結構中所有的View的尺寸和位置。舉個栗子,你約束一個Button,令它的水平中心線和一個ImageView相同,并且它的上邊緣距離ImageView的下邊緣有8個像素。如果ImageView的尺寸或者位置改變,Button會自動調整,以符合之前設置的約束。
這種基于約束的設計,允許我們搭建能夠動態響應內部和外部變化的用戶界面。
外部變化
外部變化發生于superview的尺寸或者位置改變,比如,
-
設備屏幕旋轉
-
支持不同屏幕大小的設備
這時,所有的View都要重新計算尺寸和位置。每一次變化,都會刷新視圖層級結構的布局。這些變化大部分發生在運行時,它們需要APP能夠動態響應。
內部變化
內部變化發生于你的界面中的View的尺寸或者位置發生改變。比如,
-
APP中顯示的內容的改變,新的內容可能需要一個新的布局。一般,在顯示文字或者圖片時會出現這種情況。
-
APP支持動態設置。如果用戶可以設置字體大小,這將會改變任何與文本相關的控件的高度或者寬度,布局必須能夠適應變化。
約束Constraints
Auto Layout的實現是基于設置在View上的一系列約束的。每一條約束都是一個表達式。
下圖是官方文檔給的示例圖:
這個約束表明, Red View 的 左邊緣 與 Blud View 的 右邊緣 的距離為8。這個等式由以下幾個部分組成:
-
Item 1:表達式中的第一個物件。在這個例子中是 Red View 。
-
Attribute 1:第一個物件的一個屬性。在這個例子中是 Red View 的 leading edge 。
-
Relationship:表達式左右兩邊的關系,可以使 等于 , 大于等于 或者 小于等于 。在這個例子中,兩邊的關系是相等的。
-
Multiplier:和第二個物件的屬性相乘的乘數,是一個浮點型。在這個例子中是 1.0 。一般情況下,這個值不可置為 0.0 。
-
Item 2:表達式中的第二個物件。在這個例子中是 Blue View 。它是可以為空的,即表達式變成 Item 1 * Attribute 1 = 0.0 * NotAnAttribute + Constant 。
-
Attribute 2:第二個物件的一個屬性。在這個例子中是 Blue View 的 trailing edge 。
-
Constant:一個浮點型的常數。在這個例子中是 8.0 。
大部分的約束是定義兩個物件之間的關系。這些物件必須是 View 或者 Layout Guide 。約束也可以定義一個物件的兩個屬性之間的關系,比如設置一個物件的高度或者寬度。當第二個物件為空時,它的屬性必須被設為 Not An Attribute ,并且 Multiplier 為置為 0.0 。
約束中用到的屬性
通常情況下,包含四個邊(leading,trailing,top和bottom),以及高度(height),寬度(width),水平中心點(CenterY),垂直中心點(CenterX)。文本類型的物件還有一個基線(baseline)屬性。
屬性說明
-
Height和Width。這兩個屬性可以被直接賦值,可以是一個常數,也可以是其他View的Height或者Width值。但是,不可以為負數。
-
Top、Bottom、Baseline。可以和 Top 、 Bottom 、 Baseline 、 CenterY 組合。
-
Leading和Trailing。可以和 Leading 、 Trailing 、 CenterX 組合。
-
Left和Right。避免使用這兩個屬性,而使用 Leading 和 Trailing 來替代它們。
-
CenterX和CenterY。CenterX可以和 Leading 、 Trailing 、 Left 、 Right 組合。CenterY可以和 Top 、 Bottom 、 Baseline 組合。
使用屬性定義約束
上面提到的屬性可以分為兩類, 尺寸相關 和 位置相關 。尺寸相關(如height、width)用來定義物件的大小。位置相關(如leading,top)的屬性用來表明該物件和其他物件之間的位置關系。使用這些屬性時需要注意:
-
不要使用尺寸相關的屬性去約束一個位置相關的屬性。
-
只可以給尺寸相關的屬性直接賦值一個常量。
舉幾個簡單的例子:
// 設置一個固定高度 View.height = 0.0 * NotAnAttribute + 40.0// 設置兩個按鈕之間的固定距離 Button_2.leading = 1.0 * Button_1.trailing + 8.0
// 讓兩個按鈕的左邊緣對齊 Button_1.leading = 1.0 * Button_2.leading + 0.0
// 給兩個按鈕相同的寬度 Button_1.width = 1.0 * Button_2.width + 0.0
// 讓View的中心和父類的中心相同 View.centerX = 1.0 Superview.centerX + 0.0 View.centerY = 1.0 Superview.centerY + 0.0
// 設置一個View的寬高比 View.height = 2.0 * View.width + 0.0</pre>
約束的設置沒有最好的,只有最適合的。
約束的優先級
優先級是Auto Layout在計算的時候用到的參數。優先級的值可以是1-1000任意整數。系統定義了low(250)、medium(500)、high(750)和required(1000)四個等級。一般情況下,我們手動設置的優先級的值也會集中在這四個等級下。
關于Auto Layout是如何通過優先級來計算出解決方案,我在看完官方文檔后還是一頭霧水。希望有大神可以指點一二。
參考內容:
蘋果官方文檔: Auto Layout Guide