iOS9新特性-UIStackView,ios9-uistackview

來源:互聯網
上載者:User

iOS9新特性-UIStackView,ios9-uistackview

1. UIStackView相關屬性理解

UIStackView是iOS9之後推出的,我也是第一次接觸,在學習的過程中對於其中的相關屬性,尤其是對其中的distribution幾個屬性值,一知半解的,所以特寫此文通過代碼執行個體理解它們每個屬性的區別。

UIStackView主要包括了四大屬性:axis、alignment、distribution、spacing。

一、axis

主要設定UIStackView布局的方向:水平方向或垂直方向。

typedef NS_ENUM(NSInteger, UILayoutConstraintAxis) {UILayoutConstraintAxisHorizontal = 0,//水平UILayoutConstraintAxisVertical = 1//垂直};

 

二、alignment

主要設定非軸方向子視圖的對齊。

typedef NS_ENUM(NSInteger, UIStackViewAlignment) {UIStackViewAlignmentFill,//子視圖填充StackViewUIStackViewAlignmentLeading,//子視圖靠左對齊(axis為垂直方向而言)UIStackViewAlignmentTop = UIStackViewAlignmentLeading,//子視圖頂部對齊(axis為水平方向而言)UIStackViewAlignmentFirstBaseline, // 按照第一個子視圖的文字的第一行對齊,同時保證高度最大的子視圖底部對齊(只在axis為水平方向有效)UIStackViewAlignmentCenter,//子視圖置中對齊UIStackViewAlignmentTrailing,//子視圖靠右對齊(axis為垂直方向而言)UIStackViewAlignmentBottom = UIStackViewAlignmentTrailing,//子視圖底部對齊(axis為水平方向而言)UIStackViewAlignmentLastBaseline, // 按照最後一個子視圖的文字的最後一行對齊,同時保證高度最大的子視圖頂部對齊(只在axis為水平方向有效)} NS_ENUM_AVAILABLE_IOS(9_0);

 

具體顯示效果如下:


fill
top
center
bottom
first base line
last base line


三、distribution

設定軸方向上子視圖的分布比例(如果axis是水平方向,也即設定子視圖的寬度,如果axis是垂直方向,則是設定子視圖的高度)。

typedef NS_ENUM(NSInteger, UIStackViewDistribution) {UIStackViewDistributionFill = 0,UIStackViewDistributionFillEqually,UIStackViewDistributionFillProportionally,UIStackViewDistributionEqualSpacing,UIStackViewDistributionEqualCentering,} NS_ENUM_AVAILABLE_IOS(9_0);

下面以axis=UILayoutConstraintAxisHorizontal,
alignment=UIStackViewAlignmentCenter為例:往UIStackView中添加三個UIView,第一個UIView設為40100,第二個UIView設為8080,第一個UIView設為120*60,通過執行個體來說明每個屬性的區別:

(1)UIStackViewDistributionFill = 0,預設屬性,軸方向上填充UIStackView。如果axis為水平方向,則所有子視圖的寬度等於UIStackView的寬,所以如果只有一個子視圖,則子視圖的寬度就等於UIStackView的寬,如果有兩個子視圖,且優先順序一樣,則會展開或壓縮某個子視圖,使兩個子視圖的寬度之和等於UIStackView的寬……,如果axis是垂直方向,則所有子視圖的高度等於UIStackView的高,必要時會展開或壓縮某個子視圖。

上面是在子視圖優先順序一致的情況下,如果子視圖優先順序不一致,則會按優先順序從高到低設定子視圖的位置,對優先順序最低的子視圖進行必要的展開或壓縮。

設定distribution=UIStackViewDistributionFill後顯示效果:


UIStackViewDistributionFill

,由於三個子視圖的寬度之和不夠UIStackView的寬度,優先順序又一致,所以第三個子視圖被展開了。當然,我們可以修改某個子視圖的優先順序來讓其被展開。

(2)UIStackViewDistributionFillEqually,該屬性設定後使所有子視圖在軸方向上等寬或等高。即如果是水平方向,所有子視圖都會被必要的展開或壓縮,使得每個子視圖的寬度一致,原來設定的子視圖的寬度都會被忽略;如果是垂直方向,所有子視圖的高度也會保持一致,如下所示:


UIStackViewDistributionFillEqually

(3)UIStackViewDistributionFillProportionally 該屬性設定後會根據原先子視圖的比例來展開或壓縮子視圖的寬或高,如執行個體中三個子視圖原先設定的寬度是1:2:3,所以水平方向上顯示時,會按照這個比例進行展開,如所示,展開後的寬度依然是1:2:3。


UIStackViewDistributionFillProportionally


(4)UIStackViewDistributionEqualSpacing 該屬性會保持子視圖的寬高,所有子視圖中間的間隔保持一致。如所示,圖中子視圖的間隔(綠線所示的長度)都是一致的。


UIStackViewDistributionEqualSpacing


(5)UIStackViewDistributionEqualCentering 該屬性是控制所有子視圖的中心之間的距離保持一致,如所示,子視圖中心點之間的間隔(綠線所示的長度)是一致的。


UIStackViewDistributionEqualCentering


四、spacing 該屬性控制子視圖之間的間隔大小,在distribution前三個屬性值設定的情況下,子視圖之間是沒有間隔,我們可以通過spacing屬性顯式的設定,如在distribution=UIStackViewDistributionFillEqually情況下,設定子視圖間隔為10,子視圖之間間隔都為10,且子視圖依然等寬。


spacing=10

2.進階

我們可以從Interface Builder右側的操作面板中,選擇UIStackView控制項直接拖到XIB中。可以選擇HorizontalVertical兩個方向的UIStackView,也可以在拖到XIB中之後手動修改。


樣本圖片

然後將兩個View拖到這個UIStackView中,父視圖也可以將UIStackView作為子視圖來進行多層UIStackView嵌套,這也是蘋果推薦的做法。


樣本圖片

開啟右側設定面板來設定UIStackView的一些屬性,達到更好的布局效果。


樣本圖片

除了上面的方法也可以在XIB中直接選擇多個View,然後點擊右下方的Stack按鈕,系統會自動推斷布局方式,幫我們自動布局子視圖,我們可以在系統布局之後在手動進行調整。


樣本圖片

代碼布局其實本質上就是對數組進行操作,數組中儲存的是UIStackView的子視圖。然後通過設定UIStackView的枚舉值屬性進行頁面排布。代碼布局的方式這裡就不示範了。。。

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.