概述
UIStackView
是iOS9
中新增的API瞳别,類似于Android
中的線性布局痘绎。UIStackView提供了一個(gè)高效的接口用于平鋪一行或一列的視圖組合。對(duì)于嵌入到StackView的視圖帚桩,你不用再添加自動(dòng)布局的約束了纤怒。Stack View管理這些子視圖的布局,并幫你自動(dòng)布局約束峭状。也就是說克滴,這些子視圖能夠適應(yīng)不同的屏幕尺寸。此外优床,你可以嵌入一個(gè)stack View到另一個(gè)stack view中來創(chuàng)建更為復(fù)雜的用戶界面劝赔。不要誤解我的意思,這并不意味著你就不需要處理自動(dòng)布局了胆敞。你仍舊要定義一些布局約束來約束stack view着帽。它只是幫你節(jié)約了為每個(gè)UI元素創(chuàng)建約束的時(shí)間杂伟,同時(shí)它更容易的從布局中添加/刪除一個(gè)視圖。
UIStackView的優(yōu)點(diǎn)
- 對(duì)于一些開發(fā)者來說使用autolayout設(shè)計(jì)一些復(fù)雜的交互界面是比較困難的仍翰。
UIStackView
正好能幫助到并讓我們的開發(fā)者的工作變得更容易些赫粥。(StackView內(nèi)部的控件 StackView會(huì)自動(dòng)給它們添加約束的) 但是 并不是 就完全不需要 AutoLayout了 。你仍舊要定義一些布局約束來約束stack view - 更容易的從布局中添加/刪除一個(gè)視圖予借。
UIStackView介紹
1.初始化
- (instancetype)initWithArrangedSubviews:(NSArray<__kindof UIView *> *)views;//初始化方法傳入需要用UIStackView管理的存放子視圖的數(shù)組,并按照數(shù)組中的順序添加這些子視圖越平。
2.添加/移除子視圖
- (void)addArrangedSubview:(UIView *)view;//添加view到UIStackView對(duì)象上并且讓UIStackView管理這個(gè)view布局
- (void)removeArrangedSubview:(UIView *)view;//取消UIStackView的管理,但是這個(gè)view不從UIStackView上移除 如果想從UIstackView從移除 還要配合 removeFromSuperview 使用
- (void)insertArrangedSubview:(UIView *)view atIndex:(NSUInteger)stackIndex;//UIStackView管理存放子視圖的數(shù)組灵迫,按照順序來布局喧笔,這個(gè)方法是向這個(gè)數(shù)組里指定位置添加view
3.UIStackView排列方式
typedef NS_ENUM(NSInteger, UILayoutConstraintAxis)
{
UILayoutConstraintAxisHorizontal = 0, //子視圖水平排列
UILayoutConstraintAxisVertical = 1 //子視圖垂直排列
};
@property(nonatomic) UILayoutConstraintAxis axis;
//這個(gè)屬性是用來設(shè)置UIStackView中子視圖的排列方式
4.子視圖分布樣式
typedef NS_ENUM(NSInteger, UIStackViewDistribution)
{
UIStackViewDistributionFill = 0,
UIStackViewDistributionFillEqually,
UIStackViewDistributionFillProportionally,
UIStackViewDistributionEqualSpacing,
UIStackViewDistributionEqualCentering,}
NS_ENUM_AVAILABLE_IOS(9_0);
@property(nonatomic) UIStackViewDistribution distribution;
//UIStackView中子視圖的分布樣式
- UIStackViewDistributionFill
根據(jù)UIStackView
的排列方式,用子視圖鋪滿填充指定的 方向龟再, -
UIStackView
:垂直排列:UIStackView
中的子視圖將填充滿UIStackView
的高度。 -
UIStackView
:水平排列:UIStackView
中的子視圖將填充滿UIStackView
的寬度尼变。 - 由于每個(gè)視圖是由
UIStackView
自動(dòng)添加約束的利凑,要進(jìn)行鋪滿操作就對(duì)視圖進(jìn)行拉伸,指定某個(gè)視圖拉伸嫌术,可以更改其壓縮或者拉伸的優(yōu)先級(jí)實(shí)現(xiàn)哀澈。- 拉伸優(yōu)先級(jí)priority值越低 優(yōu)先級(jí)越高 先被拉伸
-
如果優(yōu)先級(jí)相同 默認(rèn) 拉伸第一個(gè)UI控件
-
UIStackViewDistributionFillEqually
UIStackViewDistributionFillEqually
保證鋪滿后如果是垂直排列所有的子視圖高度相等,如果是水平排列所有的子視圖寬度相等度气。
UIStackViewDistributionFillEqually UIStackViewDistributionFillProportionally
根據(jù)每個(gè)子視圖里面內(nèi)容的尺寸來進(jìn)行填充操作
-
UIStackViewDistributionEqualSpacing
排列視圖割按,保證每個(gè)子視圖之間的間距相等
UIStackViewDistributionEqualSpacing UIStackViewDistributionEqualCentering
排列視圖,保證每個(gè)子視圖中心直接的間距相等
- 5磷籍、子視圖對(duì)齊方式
typedef NS_ENUM(NSInteger, UIStackViewAlignment) {
UIStackViewAlignmentFill, //水平:subView的上下和StackView的上下邊距 相等 垂直: subView的左右邊距和 StackView的所有相等
UIStackViewAlignmentLeading,//垂直有效 :左對(duì)齊
UIStackViewAlignmentTop =UIStackViewAlignmentLeading, // 水平有效 上對(duì)齊
UIStackViewAlignmentFirstBaseline,//水平有效适荣,第一行基準(zhǔn)線對(duì)齊。
UIStackViewAlignmentCenter, //中心基準(zhǔn)線對(duì)齊 1.水平 高度中點(diǎn)對(duì)齊 2.垂直:寬度中點(diǎn)對(duì)齊
UIStackViewAlignmentTrailing, //垂直有效院领,右邊界對(duì)齊弛矛。
UIStackViewAlignmentBottom =UIStackViewAlignmentTrailing,// 水平有效 ,下邊界對(duì)齊比然。
UIStackViewAlignmentLastBaseline,//水平有效丈氓,最后一行基準(zhǔn)線對(duì)齊。
} NS_ENUM_AVAILABLE_IOS(9_0);
@property(nonatomic) UIStackViewAlignment alignment;//設(shè)置UIStackView中子視圖對(duì)齊的方式
- 5.子視圖之間的間距
@property(nonatomic) CGFloat spacing//每個(gè)子視圖之間的間距强法,在某些布局的情況下spacing將作為最小的間距万俗。
UIStackView的創(chuàng)建
1、第一種方式
- 直接創(chuàng)建UIStackView 饮怯,再向其中添加 UI控件
先創(chuàng)建在添加 - 接下來闰歪,放置一個(gè)ImageView到
StackView
里,這個(gè)時(shí)候你會(huì)發(fā)現(xiàn)imageview自動(dòng)填充了這個(gè)Stackview
硕淑,接下繼續(xù)拖入兩個(gè)imageview课竣,神奇的事情發(fā)生了嘉赎,Stackview
內(nèi)的圖片都做到了很好的自適應(yīng)。 - 前提是 你把
Stackview
的Distribution屬性設(shè)置成Fill Equally
2于樟、第二種方式
- 先創(chuàng)建控件 在通過控件 創(chuàng)建
UIStackView
先創(chuàng)建控件 在通過控件 創(chuàng)建`UIStackView` - 注意 : 如果是通過這種方法創(chuàng)建的
UIStackView
會(huì)根據(jù) 控件的排列 自動(dòng)判斷是創(chuàng)建豎直的
還是水平的
公条,可以通過下圖設(shè)置,按需求修改迂曲,豎直
還是水平
靶橱。
3、通過代碼創(chuàng)建UIStackView
//創(chuàng)建UIStackView
UIStackView * stackView=[[UIStackView alloc] initWithArrangedSubviews:@[imageView1,imageView