UIStackView是iOS9之后推出的,我也是第一次接觸,在學(xué)習(xí)的過程中對于其中的相關(guān)屬性,尤其是對其中的distribution幾個屬性值,一知半解的,所以特寫此文通過代碼實(shí)例理解它們每個屬性的區(qū)別。
UIStackView主要包括了四大屬性:axis、alignment、distribution、spacing。
一、axis
主要設(shè)置UIStackView布局的方向:水平方向或垂直方向。
typedef NS_ENUM(NSInteger, UILayoutConstraintAxis) {
UILayoutConstraintAxisHorizontal = 0,//水平
UILayoutConstraintAxisVertical = 1//垂直
};
二、alignment
主要設(shè)置非軸方向子視圖的對齊方式。
typedef NS_ENUM(NSInteger, UIStackViewAlignment) {
UIStackViewAlignmentFill,//子視圖填充StackView
UIStackViewAlignmentLeading,//子視圖左對齊(axis為垂直方向而言)
UIStackViewAlignmentTop = UIStackViewAlignmentLeading,//子視圖頂部對齊(axis為水平方向而言)
UIStackViewAlignmentFirstBaseline, // 按照第一個子視圖的文字的第一行對齊,同時保證高度最大的子視圖底部對齊(只在axis為水平方向有效)
UIStackViewAlignmentCenter,//子視圖居中對齊
UIStackViewAlignmentTrailing,//子視圖右對齊(axis為垂直方向而言)
UIStackViewAlignmentBottom = UIStackViewAlignmentTrailing,//子視圖底部對齊(axis為水平方向而言)
UIStackViewAlignmentLastBaseline, // 按照最后一個子視圖的文字的最后一行對齊,同時保證高度最大的子視圖頂部對齊(只在axis為水平方向有效)
} NS_ENUM_AVAILABLE_IOS(9_0);
具體顯示效果如下:
三、distribution
設(shè)置軸方向上子視圖的分布比例(如果axis是水平方向,也即設(shè)置子視圖的寬度,如果axis是垂直方向,則是設(shè)置子視圖的高度)。
typedef NS_ENUM(NSInteger, UIStackViewDistribution) {
UIStackViewDistributionFill = 0,
UIStackViewDistributionFillEqually,
UIStackViewDistributionFillProportionally,
UIStackViewDistributionEqualSpacing,
UIStackViewDistributionEqualCentering,
} NS_ENUM_AVAILABLE_IOS(9_0);
下面以axis=UILayoutConstraintAxisHorizontal,
alignment=UIStackViewAlignmentCenter為例:往UIStackView中添加三個UIView,第一個UIView設(shè)為40100,第二個UIView設(shè)為8080,第一個UIView設(shè)為120*60,通過實(shí)例來說明每個屬性的區(qū)別:
(1)UIStackViewDistributionFill = 0,默認(rèn)屬性,軸方向上填充UIStackView。如果axis為水平方向,則所有子視圖的寬度等于UIStackView的寬,所以如果只有一個子視圖,則子視圖的寬度就等于UIStackView的寬,如果有兩個子視圖,且優(yōu)先級一樣,則會拉伸或壓縮某個子視圖,使兩個子視圖的寬度之和等于UIStackView的寬……,如果axis是垂直方向,則所有子視圖的高度等于UIStackView的高,必要時會拉伸或壓縮某個子視圖。
上面是在子視圖優(yōu)先級一致的情況下,如果子視圖優(yōu)先級不一致,則會按優(yōu)先級從高到低設(shè)置子視圖的位置,對優(yōu)先級最低的子視圖進(jìn)行必要的拉伸或壓縮。
設(shè)置distribution=UIStackViewDistributionFill后顯示效果:
如圖所示,由于三個子視圖的寬度之和不夠UIStackView的寬度,優(yōu)先級又一致,所以第三個子視圖被拉伸了。當(dāng)然,我們可以修改某個子視圖的優(yōu)先級來讓其被拉伸。
(2)UIStackViewDistributionFillEqually,該屬性設(shè)置后使所有子視圖在軸方向上等寬或等高。即如果是水平方向,所有子視圖都會被必要的拉伸或壓縮,使得每個子視圖的寬度一致,原來設(shè)置的子視圖的寬度都會被忽略;如果是垂直方向,所有子視圖的高度也會保持一致,如下所示:
(3)UIStackViewDistributionFillProportionally 該屬性設(shè)置后會根據(jù)原先子視圖的比例來拉伸或壓縮子視圖的寬或高,如實(shí)例中三個子視圖原先設(shè)置的寬度是1:2:3,所以水平方向上顯示時,會按照這個比例進(jìn)行拉伸,如下圖所示,拉伸后的寬度依然是1:2:3。
(4)UIStackViewDistributionEqualSpacing 該屬性會保持子視圖的寬高,所有子視圖中間的間隔保持一致。如下圖所示,圖中子視圖的間隔(綠線所示的長度)都是一致的。
(5)UIStackViewDistributionEqualCentering 該屬性是控制所有子視圖的中心之間的距離保持一致,如下圖所示,子視圖中心點(diǎn)之間的間隔(綠線所示的長度)是一致的。
四、spacing 該屬性控制子視圖之間的間隔大小,在distribution前三個屬性值設(shè)置的情況下,子視圖之間是沒有間隔,我們可以通過spacing屬性顯式的設(shè)置,如下圖在distribution=UIStackViewDistributionFillEqually情況下,設(shè)置子視圖間隔為10,子視圖之間間隔都為10,且子視圖依然等寬。