Auto Layout 和 Constraints

red 8年前發布 | 6K 次閱讀 iOS開發 Android開發 移動開發

來自: 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

 本文由用戶 red 自行上傳分享,僅供網友學習交流。所有權歸原作者,若您的權利被侵害,請聯系管理員。
 轉載本站原創文章,請注明出處,并保留原始鏈接、圖片水印。
 本站是一個以用戶分享為主的開源技術平臺,歡迎各類分享!