基于官方文档进行翻译,但不限于翻译。减少废话。
Common Stack View Layouts 部分可以不看,没啥营养。
Introduction (介绍)
水平和竖直方向对给集合内的 Views 进行布局
Overview (概述)
通过 addArrangedSubview 方法把 Views 添加到 UIStackView , 一般不需要写 Views 的布局。如果想改 Views 的布局可以通过UIStackView的属性,比如 axis
、distribution
、alignment
、spacing
、isLayoutMarginsRelativeArrangement
等
Stack View and Auto Layout
Stack View 和自动布局
Views 布局默认是依赖 UIStackView 的 axis 方向的 edges, 如果想和 edges 有间距。可以把 isLayoutMarginsRelativeArrangement 设为 true, 并且设置好 layoutMargins 的值。
UIStackView 沿着坐标轴进行布局默认是通过 intrinsicContentSize 进行布局的。
对于 distribution 属性,只有 fillEqually
是把所有 View的长度都拉伸到,最长 View 的 intrinsicContentSize 的尺寸,理解成宽(沿着 axis)。
对于 alignments 属性,只有 fill
是把所有 View 垂直 axis 的高度都拉伸到,最高的 View 的 intrinsicContentSize 的尺寸,理解成高(垂直 axis)。
Positioning and Sizing the Stack View
Stack View 的位置和大小
固定 UIStackView 的两个边即可,其它会根据内容计算。
- 沿着 axis 宽是所有 View 的长加上间隙
- 垂直 axis 高是最高的那个 View 的高
- isLayoutMarginsRelativeArrangement 为 true ,还需要加上 margins 。
对于 baseline , UIStackView 的 forFirstBaselineLayout
和 forLastBaselineLayout
属性,返回的都是内嵌 View 的值(baseline 是基于 intrinsicContent 的,如果有压缩和拉伸会有显示错误)。
Common Stack View Layouts
Stack View通用约束
-
Define the position only
只固定位置约束,UIStackView 的宽和高(seize)会自由伸缩。这种情况适用于内容自适应。 -
Define the stack’s size along its axis
给定三个约束,未约束的边就会自由变化。适用于内容指定方向伸缩。 -
Define the stack’s size perpendicular to its axis
给定垂直 axis 方向两个约束和 axis 方向一个约束, UIStackView 就会在 axis 未约束的方向进行伸缩。 -
Define the size and position of the stack view
这个没啥好说的, 坐标和位置都固定的使用方式。
Managing the Stack View’s Appearance
管理Stack View的外观
- axis 布局方向,vertically 或 horizontally
- distribution 布局方式
- alignment 对齐方式
- spacing Views 之间的间距
- isBaselineRelativeArrangement 是否基于 Baseline 布局
- isLayoutMarginsRelativeArrangement 是否基于 layout margins 布局,需要结合 layoutMargins 属性使用
- note:
注意约束冲突的前提下,可以UIStackView
嵌套UIStackView
并指定约束。
Maintaining Consistency Between the Arranged Views and Subviews
Arranged Views 与 Subviews 一致性
arrangeSubviews property 是 subviews property 的 子集,并且 stack views 有如下强制规则:
- 添加到 arrangedSubviews 的 views, 也会添加到
subviews
中。 - subview 从 stackview 移除,也会在
arrangedSubviews
中移除。 - 从 arrangedSubviews 中移除 view 并不会在层级结构中移除 , stackview 不会管理 view 的位置和大小,如果 view 能被现实,则在UI 层面可见。
虽然 arrangeSubviews property 是 subviews property 的 子集,但是 顺序 是独立的:
-
arrangeSubviews
索引等级低的索引先显示,水平方向就是自左向右,竖直方向就是自上而下。 -
subviews
索引等级高的先显示,后加入的最先显示。
Dynamically Changing the Stack View’s Content
动态改变 Stack View 的内容
arrangeSubviews 的 增、删、插入操作 ,已布局 view 的 isHiddle 属性更改以及 UIStackView 的属性变更,都会自动更新约束。
- note:
arrangeSubviews 删除操作,不会从父视图中删除UI,仅仅是删除了 arrangeSubviews 数组中的元素和层级没有关系。
- isHiddle 属性更改
let firstView = stackView.arrangedSubviews[0]
firstView.isHidden = true
-stackview 的任何属性更改,都会自动更新约束
// 在 vertical 和 horizontal 之间切换
if stackView.axis == .Horizontal {
stackView.axis = .Vertical
}
else {
stackView.axis = .Horizontal
}
- 你可以给多个 view 更改属性,stackview 会在size改变时,自动给改变加上动画。
UIView.animateWithDuration(0.25) { () -> Void in
let firstView = stackView.arrangedSubviews[0]
firstView.isHidden = true
}
网友评论