介紹
UIStackView 是 iOS9新增的一個布局技術。熟練掌握相當節省布局時間。
UIStackView 是 UIView 的子類,是用來約束子控件的一個控件。但他的作用僅限于此,他不能用來呈現自身的內容,類似于 backgroundColor
。當然了,這個控件相當易學,屬性只有4個。

- Axls: 子控件的布局方向,水平或者垂直
- Alignment: 類似于 UILabel 的 Alignment 屬性
- Distributlon: 子控件的大小
- Spacing: 子控件間的間距
可以看到在屬性左邊有個加號,點開來是這樣的:

這其實是 UIStackView 也集成了 Size Class,Size Class 是用來布局不同尺寸屏幕的。在這里可以通過選擇不同的尺寸來更新子控件約束。
使用
接下來我們在 IB 中使用 UIStackView 來完成以下布局:

首先上面的 ImageView 是直接做約束完成的。
然后我們可以選擇左下角的三個 Label,然后點擊右下角第一個圖標合成 UIStackView:

因為三個 Label 間是有間距的,所以接下來我們修改 Spacing 屬性:

這樣就很方便的做好了 UIStackView 內部子視圖的布局,然后只需要給 UIStackView 設置離左邊和下邊的約束即可,因為這個 UIStackView 內部的子視圖都是 UILabel, UILabel 都是有他自身的固有大小的,所以不需要設置4個布局。

這樣我們就完成了左邊三個 Lable 的布局。接下來我們來布局右邊的2個控件。
還是和剛才一樣,選擇 Image 和 label,并且組成一個 UIStackView 并設置好 UIStackView 的布局約束:

接下來布局內部子控件約束:

做好這兩步你會發現 IB 還是報錯,這是因為 UIStackView 并不知道他內部的 image 的寬高,這時候我們可以讓 image 有他的固有大?。?br> 
將 intrinsic Size 的屬性改為 Placeholder,這時候就解決了報錯,至此,整個 View 的約束已經做完,是不是發現比之前全部用 Auto Layout 快多了。
當然了 UIStackView 也是可以用代碼創建的。
class UIStackView : UIView {
init(arrangedSubviews views: [UIView])
var arrangedSubviews: [UIView] { get }
func addArrangedSubview(view: UIView)
func removeArrangedSubview(view: UIView)
func insertArrangedSubview(view: UIView, atIndex stackIndex: Int) ...
}
第一個方法是用來創建一個 UIStackView 的,傳入 views 里的數組的順序代表了 UIStackView 里子視圖的順序。
第二個方法是用來獲得 UIStackView 里有哪些子視圖的。
后面3個方法和 UIView 里的方法是類似的。
看到 addArrangedSubview
和 removeArrangedSubview
你是不是想到了addSubView
和removfromSuperView
。
下面有張表,可以區別這四個方法:

從表中可以看出,添加 UIStackView 的子視圖應該用 addArrangedSubview
,移除 UIStackView 某個子視圖應該用 removeArrangedSubview
。
UIStackView 用來約束子視圖的屬性有以下幾個
var axis: UILayoutConstraintAxis
var distribution: UIStackViewDistribution
var alignment: UIStackViewAlignment
var spacing: CGFloat
var baselineRelativeArrangement: Bool
var layoutMarginsRelativeArrangement: Bool
這些就是使用代碼來創建 UIStackView 了。
UIStackView 還是蠻簡單的,但是功能卻十分強大。這篇文章應該能讓大家了解 UIStackView 的基本使用了。