苹果在iOS9新增了一个简易的布局控件UIStackView,它是一个基于 Auto Layout 的抽象层从而使布局属性的创建简单化,它可以将一组 UIView 视图进行垂直或水平方向的排列。
- UIStackView 既可以用代码编写也可以在 Interface Builder 中设计(简易xib更方便适用)。
- 你可以在一个主 UIStackView 中嵌套 UIStackView 从而让视图精确放置到相应的位置
下面就具体介绍一下UIStackView的一些方法和属性
一.方法
1.初始化数组
1 2 3 4 5 6 7 8 9
|
- (instancetype)initWithArrangedSubviews:(NSArray<__kindof UIView *> *)views;
let stackView1 = UIStackView(arrangedSubviews: subViews)
|
2.添加子视图
1 2 3 4 5 6 7 8 9
|
- (void)addArrangedSubview:(UIView *)view;
stackView.addArrangedSubview(UIView)
|
3.移除子视图
1 2 3 4 5 6 7 8 9
|
- (void)removeArrangedSubview:(UIView *)view;
stackView1.removeArrangedSubview(UIView)
|
4.根据下标插入子视图
1 2 3 4 5 6 7 8 9
|
- (void)insertArrangedSubview:(UIView *)view atIndex:(NSUInteger)stackIndex;
stackView1.insertArrangedSubview(UIView, atIndex: Int)
|
二.属性
1.布局方向
1 2 3 4 5 6 7 8 9 10 11 12 13
| stackView.axis = .Horizontal
Horizontal -> UILayoutConstraintAxisHorizontal
水平方向布局
Vertical -> UILayoutConstraintAxisVertical
垂直方向布局
|
2.内容物填充样式
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25
| stackView.distribution = .FillEqually
Fill -> UIStackViewDistributionFill
填充整个UIStackView,并且根据内部子视图尺寸对子视图尺寸进行动态调整。
Fill Equally -> UIStackViewDistributionFillEqually
根据视图大小平均分配UIStackView尺寸,等比例填充UIStackView,过程中会根据分配的大小改变子视图尺寸。
Fill Proportionally -> UIStackViewDistributionFillProportionally
根据之前的比例填充UIStackView。
Equal Spacing -> UIStackViewDistributionEqualSpacing
填充整个UIStackView,子视图没有占满UIStackView将会用空白平均填充子视图中间的间距,超出UIStackView将会根据arrangedSubviews数组下标压缩子视图。
Equal Centering -> UIStackViewDistributionEqualCentering
平均分配子视图得到每个视图的中心点,使用这个中心点来布局每个子视图,并且保持spacing距离,超出将会重新布局子视图,并压缩部分子视图。
|
3.视图填充样式
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37
| stackView.alignment = .Fill
Fill -> UIStackViewAlignmentFill
视图纵向填充
Top -> UIStackViewAlignmentTop
视图向上对其(适用于Horizontal模式)
Center -> UIStackViewAlignmentCenter
视图居中对其
Bottom -> UIStackViewAlignmentBottom
视图向下对其(适用于Horizontal模式)
First Baseline -> UIStackViewAlignmentFirstBaseline
根据上方基线布局所有子视图的y值(适用于Horizontal模式)
Last Baseline -> UIStackViewAlignmentLastBaseline
根据下方基线布局所有子视图的y值(适用于Horizontal模式)
trailing -> UIStackViewAlignmentTrailing
视图向左对齐(适用于Vertical模式)
leading -> UIStackViewAlignmentLeading
视图向右对齐(适用于Vertical模式)
|
4.子控件之间最小距离
1 2 3 4 5 6 7
| stackView.spacing = 0
spacing -> CGFloat spacing
|
5.基线相对布局
1 2 3
| public var baselineRelativeArrangement: Bool
|
如果YES,则从顶视图的最后基线到底视图的顶部测量两个视图之间的垂直间距。
6.边界相对布局
1 2 3
| public var layoutMarginsRelativeArrangement: Bool
|
决定了 stack 视图平铺其管理的视图时是否要参照它的布局边距,选中 Layout Margins Relative 将相对于标准边界空白来调整subview位置
##Xib创建
- 择UIStackView控件直接拖到XIB中。可以选择Horizontal和Vertical两个方向的UIStackView,也可以在拖到XIB中之后手动修改。
- 父视图可以将UIStackView作为子视图来进行多层UIStackView嵌套,这也是苹果推荐的做法。
- 打开右侧设置面板来设置UIStackView的一些对应属性,达到更好的布局效果。
- 除了上面的方法也可以在XIB中直接选择多个View,然后点击右下方的Stack按钮,系统会自动推断布局方式,平均分配空间布局,帮我们自动布局子视图,我们可以在系统布局之后在手动进行调整。
作为一枚小菜鸟,不足之处还望大家多多指正,互相学起,共同进步!