iOS 9中增加了新的控件:UIStackView,看下圖就明白作用了。
UIStackView 類提供了一個高效的接口用于平鋪一行或一列的視圖組合。Stack視圖使你依靠自動布局的能力,創建用戶接口使得可以動態的調整設備朝向、屏幕尺寸及任何可用范圍內的變化。Stack視圖管理著所有在它的 arrangedSubviews 屬性中的視圖的布局。這些視圖根據它們在 arrangedSubviews 數組中的順序沿著 Stack 視圖的軸向排列。精確的布局變量根據 Stack 視圖的 axis, distribution, alignment, spacing, 和其它屬性共同決定。
使用 stack 視圖,打開一個你希望編輯的 Storyboard,從對象庫中拖拽出一個 Horizontal Stack View 或者一個 Vertical Stack View,并放置到你希望的位置上。下一步,將控件或視圖拖拽放置到 stack 中,如果需要你可以繼續添加視圖或者控件給指定的 stack。Interface Builder 將根據 stack 的內容自動調節尺寸。你也可以通過修改屬性面板中 Stack視圖的屬性調整 stack 內容的外觀。
注意:你需要負責指定 stack 視圖的位置和尺寸(可選的)。然后 stack 視圖將管理其內容的布局和尺寸。
UIStackView 是 UIView 的非渲染型子類。它沒有提供其自有的任何用戶接口。相反的,它只管理被其管理的視圖的位置和尺寸。因此,有些屬性(如 backgroundColor)在 stack 視圖上是無效的。類似的,你無法重寫 layerClass,drawRect: 或 drawLayer:inContext: 方法。
這里有一系列的屬性來定義 stack 視圖如何平鋪其內容。
· axis(軸向) 屬性決定了 stack 的朝向,只有垂直或水平;
· distribution(分布) 屬性決定了其管理的視圖在沿著其軸向上的布局;
· alignment(對齊) 屬性決定了其管理的視圖在垂直于其軸向上的布局;
· spacing(空隙) 屬性決定了其管理的視圖間的最小間隙;
· baselineRelativeArrangement 屬性決定了其視圖間的垂直間隙是否根據基線測量得到;
· layoutMarginsRelativeArrangement 屬性決定了 stack 視圖平鋪其管理的視圖時是否要參照它的布局邊距
通常情況下,你會使用一個 stack 視圖來布局小數量的視圖。你可以通過在其他 stack 視圖中嵌套多個 stack 視圖的方式創建更加復雜的視圖層次結構。舉例,Figure 5展示了一個包含兩個水平 stack 視圖的垂直 stack 視圖。每一個水平 stack 視圖各包含一個標簽和一個文本框。
Stack 視圖確保它的 arrangedSubviews 屬性將一直是其 subviews 屬性的子集合。明確的說,stack 視圖強制實施了以下規定:
· 無論何時 stack 視圖增加了一個視圖到它的 arrangedSubviews 數組,其也將把這個視圖作為子視圖增加,如果還未增加的話。
· 無論何時一個子視圖從 stack 視圖中被移除,那么 stack 視圖也將將其從 arrangedSubviews 數組中移除。
· 從 arrangedSubviews 移除一個視圖并不會將其作為子視圖移除。stack 視圖將不再管理該視圖的尺寸和位置,但是該視圖仍將是視圖結構的一部分,并且當其可見的情況下仍會被渲染到屏幕上。
當 arrangedSubviews 數組一直包含著 subviews 數組的子集合,這些數組間的順序仍然是獨立的。
· arrangedSubviews 數組的順序定義了展現在 stack 中的視圖的順序。對于水平 stack 視圖,這些視圖將以閱讀順序平鋪,即較小索引的視圖在較大索引視圖的左側。對于垂直 stack 視圖,這些視圖是從上到下平鋪的,及較小索引的視圖在較大索引視圖的上方。
· subviews 數組中的順序定義了子視圖在Z軸上是順序。如果視圖重疊,有較小索引的子視圖將出現在有較大索引的子視圖后方。
https://developer.apple.com/reference/uikit/uistackview#//apple_ref/doc/uid/TP40015256
雖然是iOS9才出的新功能,但是難不倒廣大的開發者 ,國內iOS團隊開發的
FDStackView - 可以將 UIStackView 的最低支持版本拉低到 iOS6,無需配置,沒有代碼侵染,扔到工程里后直接用系統 UIStackView 的 API 即可,同時兼容 Storyboard。