iOS9新特性之UIStackView
1. UIStackView相關(guān)屬性理解
UIStackView是iOS9之后推出的,我也是第一次接觸,在學(xué)習(xí)的過(guò)程中對(duì)于其中的相關(guān)屬性,尤其是對(duì)其中的distribution幾個(gè)屬性值,一知半解的,所以特寫(xiě)此文通過(guò)代碼實(shí)例理解它們每個(gè)屬性的區(qū)別。
UIStackView主要包括了四大屬性:axis、alignment、distribution、spacing。
一、axis
主要設(shè)置UIStackView布局的方向:水平方向或垂直方向。
typedef NS_ENUM(NSInteger, UILayoutConstraintAxis) { UILayoutConstraintAxisHorizontal = 0,//水平 UILayoutConstraintAxisVertical = 1//垂直 };
二、alignment
主要設(shè)置非軸方向子視圖的對(duì)齊方式。
typedef NS_ENUM(NSInteger, UIStackViewAlignment) { UIStackViewAlignmentFill,//子視圖填充StackView UIStackViewAlignmentLeading,//子視圖左對(duì)齊(axis為垂直方向而言) UIStackViewAlignmentTop = UIStackViewAlignmentLeading,//子視圖頂部對(duì)齊(axis為水平方向而言) UIStackViewAlignmentFirstBaseline, // 按照第一個(gè)子視圖的文字的第一行對(duì)齊,同時(shí)保證高度最大的子視圖底部對(duì)齊(只在axis為水平方向有效) UIStackViewAlignmentCenter,//子視圖居中對(duì)齊 UIStackViewAlignmentTrailing,//子視圖右對(duì)齊(axis為垂直方向而言) UIStackViewAlignmentBottom = UIStackViewAlignmentTrailing,//子視圖底部對(duì)齊(axis為水平方向而言) UIStackViewAlignmentLastBaseline, // 按照最后一個(gè)子視圖的文字的最后一行對(duì)齊,同時(shí)保證高度最大的子視圖頂部對(duì)齊(只在axis為水平方向有效) } NS_ENUM_AVAILABLE_IOS(9_0);
具體顯示效果如下:
fill
top
center
bottom
first base line
三、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中添加三個(gè)UIView,第一個(gè)UIView設(shè)為40100,第二個(gè)UIView設(shè)為8080,第一個(gè)UIView設(shè)為120*60,通過(guò)實(shí)例來(lái)說(shuō)明每個(gè)屬性的區(qū)別:
(1)UIStackViewDistributionFill = 0,默認(rèn)屬性,軸方向上填充UIStackView。如果axis為水平方向,則所有子視圖的寬度等于UIStackView的寬,所以如果只有一個(gè)子視圖,則子視圖的寬度就等于UIStackView的寬,如果有兩個(gè)子視圖,且優(yōu)先級(jí)一樣,則會(huì)拉伸或壓縮某個(gè)子視圖,使兩個(gè)子視圖的寬度之和等于UIStackView的寬……,如果axis是垂直方向,則所有子視圖的高度等于UIStackView的高,必要時(shí)會(huì)拉伸或壓縮某個(gè)子視圖。
上面是在子視圖優(yōu)先級(jí)一致的情況下,如果子視圖優(yōu)先級(jí)不一致,則會(huì)按優(yōu)先級(jí)從高到低設(shè)置子視圖的位置,對(duì)優(yōu)先級(jí)最低的子視圖進(jìn)行必要的拉伸或壓縮。
設(shè)置distribution=UIStackViewDistributionFill后顯示效果:
UIStackViewDistributionFill
如圖所示,由于三個(gè)子視圖的寬度之和不夠UIStackView的寬度,優(yōu)先級(jí)又一致,所以第三個(gè)子視圖被拉伸了。當(dāng)然,我們可以修改某個(gè)子視圖的優(yōu)先級(jí)來(lái)讓其被拉伸。
(2)UIStackViewDistributionFillEqually,該屬性設(shè)置后使所有子視圖在軸方向上等寬或等高。即如果是水平方向,所有子視圖都會(huì)被必要的拉伸或壓縮,使得每個(gè)子視圖的寬度一致,原來(lái)設(shè)置的子視圖的寬度都會(huì)被忽略;如果是垂直方向,所有子視圖的高度也會(huì)保持一致,如下所示:
UIStackViewDistributionFillEqually
(3)UIStackViewDistributionFillProportionally 該屬性設(shè)置后會(huì)根據(jù)原先子視圖的比例來(lái)拉伸或壓縮子視圖的寬或高,如實(shí)例中三個(gè)子視圖原先設(shè)置的寬度是1:2:3,所以水平方向上顯示時(shí),會(huì)按照這個(gè)比例進(jìn)行拉伸,如下圖所示,拉伸后的寬度依然是1:2:3。
UIStackViewDistributionFillProportionally
(4)UIStackViewDistributionEqualSpacing 該屬性會(huì)保持子視圖的寬高,所有子視圖中間的間隔保持一致。如下圖所示,圖中子視圖的間隔(綠線(xiàn)所示的長(zhǎng)度)都是一致的。
UIStackViewDistributionEqualSpacing
(5)UIStackViewDistributionEqualCentering 該屬性是控制所有子視圖的中心之間的距離保持一致,如下圖所示,子視圖中心點(diǎn)之間的間隔(綠線(xiàn)所示的長(zhǎng)度)是一致的。
UIStackViewDistributionEqualCentering
四、spacing 該屬性控制子視圖之間的間隔大小,在distribution前三個(gè)屬性值設(shè)置的情況下,子視圖之間是沒(méi)有間隔,我們可以通過(guò)spacing屬性顯式的設(shè)置,如下圖在distribution=UIStackViewDistributionFillEqually情況下,設(shè)置子視圖間隔為10,子視圖之間間隔都為10,且子視圖依然等寬。
spacing=10
2.進(jìn)階
我們可以從Interface Builder右側(cè)的操作面板中,選擇UIStackView控件直接拖到XIB中。可以選擇Horizontal和Vertical兩個(gè)方向的UIStackView,也可以在拖到XIB中之后手動(dòng)修改。
然后將兩個(gè)View拖到這個(gè)UIStackView中,父視圖也可以將UIStackView作為子視圖來(lái)進(jìn)行多層UIStackView嵌套,這也是蘋(píng)果推薦的做法。
打開(kāi)右側(cè)設(shè)置面板來(lái)設(shè)置UIStackView的一些屬性,達(dá)到更好的布局效果。
除了上面的方法也可以在XIB中直接選擇多個(gè)View,然后點(diǎn)擊右下方的Stack按鈕,系統(tǒng)會(huì)自動(dòng)推斷布局方式,幫我們自動(dòng)布局子視圖,我們可以在系統(tǒng)布局之后在手動(dòng)進(jìn)行調(diào)整。
代碼布局其實(shí)本質(zhì)上就是對(duì)數(shù)組進(jìn)行操作,數(shù)組中存儲(chǔ)的是UIStackView的子視圖。然后通過(guò)設(shè)置UIStackView的枚舉值屬性進(jìn)行頁(yè)面排布。代碼布局的方式這里就不演示了。。。😉
UIStackView和NSLayoutConstraint布局轉(zhuǎn)換
如果你之前的項(xiàng)目中已經(jīng)有約束,只需要將添加UIStackView管理UI控件約束清除。選中需要添加的UI控件,點(diǎn)擊右下方的Stack按鈕就可以。
總結(jié)
以上所述是小編給大家介紹的iOS9新特性之UIStackView,希望對(duì)大家有所幫助,如果大家有任何疑問(wèn)請(qǐng)給我留言,小編會(huì)及時(shí)回復(fù)大家的。在此也非常感謝大家對(duì)腳本之家網(wǎng)站的支持!
相關(guān)文章
iOS11 下載之?dāng)帱c(diǎn)續(xù)傳的bug的解決方法
本篇文章主要介紹了iOS11 下載之?dāng)帱c(diǎn)續(xù)傳的bug的解決方法,小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧2017-11-11iOS的UI開(kāi)發(fā)中UITabBarControlle的基本使用教程
這篇文章主要介紹了iOS的UI開(kāi)發(fā)中UITabBarControlle的基本使用教程,代碼基于傳統(tǒng)的Objective-C,需要的朋友可以參考下2015-12-12Android開(kāi)發(fā)筆記之簡(jiǎn)單基站定位程序的實(shí)現(xiàn)
這篇文章主要介紹了Android開(kāi)發(fā)筆記之簡(jiǎn)單基站定位程序的實(shí)現(xiàn),詳細(xì)的介紹了基站定位其實(shí)很簡(jiǎn)單,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下。2016-11-11iOS實(shí)現(xiàn)UIScrollView的無(wú)限輪播功能(原理)詳解
在現(xiàn)在的一些App中常常見(jiàn)到圖片輪播器,一般用于展示廣告、新聞等數(shù)據(jù),下面這篇文章主要給大家介紹了關(guān)于iOS實(shí)現(xiàn)UIScrollView的無(wú)限輪播功能(原理)的相關(guān)資料,文中通過(guò)示例代碼介紹的非常詳細(xì),需要的朋友可以參考下2018-09-09iOS中的二級(jí)菜單及Cell的展開(kāi)收起示例
本篇文章主要介紹了iOS中的二級(jí)菜單及Cell的展開(kāi)收起示例,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下。2017-08-08