ios9
之后增加了新的布局神器UIStackView
,首先我们先介绍一下UIStackView
的常用属性,然后我们根据相应的demo
阐述其在实际生产中的作用。
UIStackView
有两种形式,一种是横向布局 Horizontal Stack View
,一种是竖向布局 Vertical Stack View
。
<b>
Axis
</b>通过上图,我们看到了第一个属性
Axis
(控制 stackView
的布局),其值分别为Horizontal
,Vertical
,从字面意思可以看出,两者主要是控制UIStackView
是横向布局还是纵向布局。<b>
Alignment
</b>第二个属性
Alignment
(控制 stackView
中子控件的布局位置),在不同的布局中其值也是不一样的,在Axis=Horizontal
的时候,Alignment
的值等于Fill, top, center, bottom, first BaseLine, Last BaseLine
, 从字面的意思中我们也可以看出来,分别是填充整个屏幕,顶部对齐,居中对齐,底部对齐,以第一个元素的BaseLine对齐,以最后一个元素的BaseLine对齐
fill.png
top.png
center.png
bottom.png
�first-baseline.png
last-baseline.png
在
Axis=Vertical
的时候,Alignment的值等于fill, leading, trailing, center
,分别为填充,左侧,右边,居中。效果图就是横向布局竖起来就是了,在这里不一一截图了(有兴趣的可以自己试试)<b>
Distribution
</b>第三个属性
Distribution
,其实它是控制子空间的一些属性的,其值:Fill Equally
占据相同空间(按最大者)Fill proportionally
保持比例填充Equal Spacing
Equal Centering
拖入两个 UIView
,此时,我是在 Distribution
的选项中,选择了 fill equal
。这时,拖入的两个 view
均会布局为自动布满。另外,可以看到,其实stackView
的原理,应该是根据 相关属性,然后自动添加约束。
因此,在
Distribution
中选择 fill equal
和fill proportionally
两个选项时,stackView
均会为其自动添加约束。等比例的布局,在很多 UI界面上总是可以碰到的。所以这个还是挺有 实用性的。至于 Distribution
的选项,那么需要为其额外添加一些 高度约束。比如选择 fill
(默认),那么需要为其添加 一些高度约束,以确定 控件的大小。比如九宫格布局的话,可以在 vertical stackView
中再嵌入三个 horizontal stackView
,之后得到九宫格布局。<b>
Spacing
</b>第三个属性
Spacing
, 顾名思义就是子控件之间的简介
Spacing.png
ok, 基本的属性我们已经介绍到这里了,这时候,我会问,在实际生产中,有何用处呢?下面我们实现几个常用的功能,就知道UIStackView
的简洁性了。
- 三个单元格横向平分整个屏幕,左右等间距,宽度高度一致
我觉得在我们的实际生产中,这是最常见的一种布局了。在实际的生产场景中,我们也许会选择UICollectionView
,但是总觉得用CollectionView是大材小用了,或者用三个UIView,增加各种约束来实现,这也是我们最容易的选择的方案。我们以第二个方案为例:
如果我们实现这样的布局,首先:
1.相对于父 view
的约束。如:距离上边距 10,左边距 10。
2.相对于前一个元素的约束。如:距离上一个元素 20,距离左边的元素 5 等。
3.对齐类约束。如:跟父 view
左对齐,跟上一个元素居中对齐等。
4.相等约束。如:跟父 view
等宽高。
这样的话,我们要写很多的约束,这是我不喜欢的。
如果用UIStackView
就会简单很多了
- 定义
UIStackView
的距离父元素的左右间距 - 在
UIStackView
中拖入三个UIView
- 设置
Alignment=fill, Distribution=fill equal
(这个是实现的重点所在)
解决战斗。
- 用代码实现大众点评网中一个小布局
实现红色标注的部分
首先需要init UIStackView
UIStackView *stackView = [[UIStackView alloc] init];
设置属性
UIStackView *stackView = [[UIStackView alloc] init];
stackView.axis = UILayoutConstraintAxisHorizontal;
stackView.alignment = UIStackViewAlignmentFill;
stackView.spacing = 10;
[stackView setFrame:CGRectMake(10, 150, 300, 74)];
[self.view addSubview:stackView];
添加左侧的图片
UIImageView *leftImageView = [[UIImageView alloc] init];
[leftImageView setImage:[UIImage imageNamed:@"2.png"]];
[leftImageView setFrame:CGRectMake(10, 10, 100, 74)];
[stackView addArrangedSubview:leftImageView];
当把imageView
加入到StackView
的时候,不是使用的addSubview
而是addArrangedSubview
下面定义右边的部分,直接上代码
UIStackView *secondStackView = [[UIStackView alloc] init];
secondStackView.axis = UILayoutConstraintAxisVertical;
secondStackView.alignment = UIStackViewAlignmentFill;
secondStackView.distribution = UIStackViewDistributionFill;
[secondStackView setFrame:CGRectMake(0, 0, 184, 74)];
[stackView addArrangedSubview:secondStackView];
UILabel *lable = [[UILabel alloc] init];
lable.text = @"煲宫(龙阳店)";
UIImageView *secondImage = [[UIImageView alloc] init];
[secondImage setImage:[UIImage imageNamed:@"1.png"]];
UILabel *lable2 = [[UILabel alloc] init];
lable2.text = @"世纪公园 更多火锅";
[secondStackView addArrangedSubview:lable];
[secondStackView addArrangedSubview:secondImage];
[secondStackView addArrangedSubview:lable2];
[stackView addArrangedSubview:secondStackView];
UIStackView暂时先介绍到这里。
上面的代码:https://github.com/BernardChina/UIStackViewDemo.git
请各位看官多多指教,目前代码有些布局有些小调整。
网友评论