iOS9 提供的UIStackview簡化了布局操作,它有些像Android中的liner layout。以前不用UIStackview也是可以做出類似的效果的,不過要添加許多的約束,看得頭都大了,使用了UIStackview后,約束得到了簡化。
UIStackview中,不太好理解的就是distribution這個屬性,它的值如下:
typedef NS_ENUM(NSInteger, UIStackViewDistribution) { UIStackViewDistributionFill = 0, UIStackViewDistributionFillEqually, UIStackViewDistributionFillProportionally, UIStackViewDistributionEqualSpacing, UIStackViewDistributionEqualCentering, } NS_ENUM_AVAILABLE_IOS(9_0);
需要注意的是,UIStackview內部也是通過約束來實現的,因此,必須提供足夠的且正確的約束才能使用好它。
1.UIStackViewDistributionFill
Fill,就是填滿了。這里分2種情況。
情況1,StackView的大小是固定的
如圖,stackview的大小被固定了,那么它包含的4個子視圖就一定會充滿整個stackview,怎么分配這4個子視圖的大小呢?這就需要我們提供constraint來實現了。如果我們提供的contraint不對,就會產生問題。這里建議加入3個view的 高度 contraint,並且這3個高度之和要小於實際stackview的高度,這樣,stackview就能通過調整第四個view達到fill的效果。
情況2,stackview的大小沒有進行限制。
在垂直布局的情況下,如果不對stackview的高度進行約束,如圖,
我們刪除了stackview的底部約束。這樣,只要我們提供了詳細的4個子view的高度約束,stackview就會自動調整高度,包裹住內容,很像android中的線性布局。
看看效果
2.UIStackViewDistributionFillEqually
這個比較好理解,就是會自動調整高度,使它們高度一致。
也是存在2中情況,當stackview的高度有約束時,我們就不需要對子view添加高度約束了,系統會為我們做好。
當stackview的高度沒約束時,我們就必須提供某個子view的高度約束,讓系統好計算出剩下子view的高度和stackview的高度。
3.UIStackViewDistributionFillProportionally
按照原比例縮放。原比例哪里來?官方文檔說,來自intrinsic size,我感覺比較簡單的方法還是自己添加約束。
這個屬性,一般是stackview的高度有約束,而4個subview的高度也有約束,注意subview的高度約束的priority要低於1000。stackview可以根據subview的約束,計算出比例,進行縮放。
4.UIStackViewDistributionEqualSpacing, 5.UIStackViewDistributionEqualCentering,
這2個選項也是應用於stackview高度確定,subview的高度也確定,想讓subview比較均勻地分布在stckview中。均勻分布的方法不同,所以有2個選項。
另外,stackview的一個特點是,當把其中的一個子view去掉后,布局會重新渲染,就如同android布局中的 gone 選項,十分好用!省去了以前大把大把的代碼。那么這個所謂的去掉是什么操作呢?一般來說,是設置子view的hidden = true,並且調用 stackview 的函數,removeArrangedSubview。在當前ios版本,如果僅僅設置hidden屬性,在有些時候,無法對剩下的子view進行自動布局。當需要重新顯示的時候,設置hidden屬性,並調用insertArrangedSubview: atIndex:方法。