什么是UIStackView胞此?
UIStackView是在iOS9中才出現(xiàn)的撤奸,它可以幫助我們布局UI控件蒿柳,從而減少我們的約束代碼跪妥。
注1:UIStackView雖然繼承自UIView,但是并不參與屏幕的渲染肌割,所以設(shè)置背景顏色和重寫drawRect:方法無(wú)效卧蜓。
注2:UIStackView用于管理其內(nèi)部視圖布局,其本身把敞,我們需要添加一些約束烦却,將它約束在屏幕中。
UIStackView的屬性
axis :布局方向(UILayoutConstraintAxis)先巴,包括2個(gè)值
水平布局(UILayoutConstraintAxisHorizontal)
垂直布局(UILayoutConstraintAxisVertical)
spacing:設(shè)置視圖之間的間距
alignment:管理視圖的對(duì)齊模式
typedef NS_ENUM(NSInteger, UIStackViewAlignment) {
UIStackViewAlignmentFill, //水平布局時(shí)為高度充滿,豎直布局時(shí)為寬度充滿
UIStackViewAlignmentLeading, //前邊對(duì)其
UIStackViewAlignmentTop = UIStackViewAlignmentLeading, //頂部對(duì)其
UIStackViewAlignmentFirstBaseline, //第一個(gè)控件文字的基線對(duì)其 水平布局有效
UIStackViewAlignmentCenter, //中心對(duì)其
UIStackViewAlignmentTrailing, //后邊對(duì)其
UIStackViewAlignmentBottom = UIStackViewAlignmentTrailing, //底部對(duì)其
UIStackViewAlignmentLastBaseline, //基線對(duì)其冒冬,水平布局有效
} NS_ENUM_AVAILABLE_IOS(9_0);
distribution:管理視圖的排序方式
typedef NS_ENUM(NSInteger, UIStackViewDistribution) {
UIStackViewDistributionFill = 0, //充滿伸蚯,并且根據(jù)內(nèi)部子視圖尺寸對(duì)子視圖尺寸進(jìn)行動(dòng)態(tài)調(diào)整
UIStackViewDistributionFillEqually, //平分充滿,每個(gè)控件占據(jù)相同尺寸排列充滿
UIStackViewDistributionFillProportionally, //根據(jù)之前的比例填充
UIStackViewDistributionEqualSpacing, //等間距排列
UIStackViewDistributionEqualCentering, //所有子視圖的中心之間的距離保持一致
} NS_ENUM_AVAILABLE_IOS(9_0);
UIStackView實(shí)戰(zhàn)使用
1简烤、UIStackView的水平和垂直布局剂邮,先來(lái)看一張效果圖:
上圖中有2個(gè)UIStackView,一個(gè)垂直布局一個(gè)水平布局(因?yàn)閁IStackView無(wú)法設(shè)置背景顏色横侦,這里UIStackView和背景之間有10的內(nèi)邊距)挥萌。
注:UIStackView不會(huì)對(duì)通過(guò)- (void)addSubview:(UIView *)view方法添加的view進(jìn)行內(nèi)部視圖布局,如上圖中的背景view枉侧。需要通過(guò)- (void)addArrangedSubview:(UIView *)view方法進(jìn)行添加視圖引瀑,如上圖中的view1、view2榨馁、view3憨栽。
垂直布局中可以看到,隱藏一個(gè)view2后,UIStackView高度也會(huì)跟著變化屑柔,而且view1和view3間距也變化了屡萤,不需要改變view3的約束就已經(jīng)達(dá)到了效果。
布局代碼如下:
UIStackView *vStackView = [[UIStackView alloc] init];
[self.view addSubview:vStackView];
self.vStackView = vStackView;
/// 設(shè)置vStackView屬性
// 設(shè)置放心垂直
vStackView.axis = UILayoutConstraintAxisVertical;
vStackView.spacing = 10;
[vStackView mas_makeConstraints:^(MASConstraintMaker *make) {
make.top.equalTo(@100);
make.leading.equalTo(@10);
make.trailing.equalTo(@-10);
// 高度未給
// make.height.equalTo(@200);
}];
/// 內(nèi)部view的布局
NSArray *array = @[view0, view1, view2];
[array mas_makeConstraints:^(MASConstraintMaker *make) {
make.height.equalTo(@60);
}];
/// 隱藏事件
- (void)clickVBtn:(UIButton *)sender {
sender.selected = !sender.selected;
NSArray *array = self.vStackView.arrangedSubviews;
UIView *view = array[1];
//view.hidden = sender.selected;
/// 動(dòng)畫(huà)
[UIView animateWithDuration:1 animations:^{
view.hidden = sender.selected;
[self.vStackView layoutIfNeeded];
}];
}
水平布局中看到掸宛,隱藏中間的view后死陆,前后2個(gè)view的間距也變化了,而且進(jìn)行了拉伸唧瘾,拉伸是因?yàn)閮?nèi)部view沒(méi)有設(shè)置寬度措译,是根據(jù)UIStackView進(jìn)行等寬內(nèi)部填充滿。
布局代碼如下:
/// 創(chuàng)建UIStackView
UIStackView *hStackView = [[UIStackView alloc] init];
[self.view addSubview:hStackView];
self.hStackView = hStackView;
/// 設(shè)置vStackView屬性
// 設(shè)置放心垂直
hStackView.axis = UILayoutConstraintAxisHorizontal;
hStackView.spacing = 10;
/// 內(nèi)部控件等寬填充滿
hStackView.distribution = UIStackViewDistributionFillEqually;
[hStackView mas_makeConstraints:^(MASConstraintMaker *make) {
make.top.mas_equalTo(vStackView.mas_bottom).offset(50);
make.leading.equalTo(@10);
make.trailing.equalTo(@-10);
make.height.equalTo(@60);
}];
/// 這里子控件不需要約束代碼
/// 隱藏事件
- (void)clickHBtn:(UIButton *)sender {
sender.selected = !sender.selected;
NSArray *array = self.hStackView.arrangedSubviews;
UIView *view = array[1];
view.hidden = sender.selected;
}
2劈愚、UIStackView的對(duì)齊方式瞳遍,先來(lái)看兩張效果圖:
注:這里只看拉伸的情況
先看alignment,這個(gè)屬性設(shè)置比較好理解菌羽。
UIStackViewAlignmentFill:填充滿UIStackView
UIStackViewAlignmentTop: 和UIStackView頂部對(duì)齊
UIStackViewAlignmentCenter: 和UIStackView居中
UIStackViewAlignmentBottom: 和UIStackView底部對(duì)齊
再看distribution屬性掠械。
UIStackViewDistributionFill:填充滿UIStackView
UIStackViewDistributionFillEqually:控件等寬填充滿UIStackView
UIStackViewDistributionFillProportionally:會(huì)根據(jù)內(nèi)部控件的寬等比例拉伸進(jìn)而填充滿UIStackView
UIStackViewDistributionEqualSpacing:內(nèi)部控件自身寬度適配,間距相等
UIStackViewDistributionEqualCentering:內(nèi)部控件自身寬度適配注祖,控件之間的中心距離相等