翻译自:https://useyourloaf.com/blog/...布局
Apple 在 iOS9 引入了 StackView,使用它能够减小约束的数量,让使用 AutoLayout 更加容易。但有一种边界使用场景是须要自定义视图之间的间隙。这种状况可使用嵌套布局的方式来解决,但解决方案有些复杂。在 iOS 11 中给出了解决方案,你能够在 StackView 中自定义视图之间的间隙。ui
这是我想建立的布局:url
如图所示,共有5个 Label。最上面的大字 Label,中间三个标准 Label,以及最下面的小字 Label。中间三个 Label 的间隙是 8pt,最上面和最下面的两个 Label 的间隙是 32pt。spa
UIStackView 在相等距离垂直分配视图的状况下工做的很好。经过设置 StackView 的间隙属性,每一个子视图的间隙是相等的。翻译
使用内嵌 StackView 的方式实现布局。code
Inner StackView 包含三个 Label,8pt 的间隙,外部 StackView 有 32pt 的间隙。这看起来能工做,实则多是引入了麻烦。好比我想 header 和 footer 的间隙不同,这就很麻烦。blog
在 iOS 11中,给某个 stackView 中的元素自定义间隙成为可能。假设咱们已经构建好一个 stackView:ci
let stackView = UIStackView(arrangedSubviews: [headerLabel, topLabel, middleLabel, bottomLabel, footerLabel]) stackView.axis = .vertical stackView.alignment = .fill stackView.spacing = 8.0
stackView 中的每一个元素间隙是8pt。想要自定义header 标签和 footer 标签的间隙,能够直接调用 iOS11 的方法设置:rem
// iOS 11 only stackView.setCustomSpacing(32.0, after: headerLabel) stackView.setCustomSpacing(32.0, after: bottomLabel
说明:get
UIStackView 在 iOS 11中增长了两个新属性,定义了系统间隙和默认间隙的值:
class let spacingUseDefault: CGFloat class let spacingUseSystem: CGFloat
这两个属性的值是由系统保存和定义的,使用的时候不要直接保存他们的返回值。系统间隙彷佛返回8pt,仍是再强调一下,使用的时候应该直接访问这两个属性而不是保存他们的值。
你能够用这两个属性设置或者恢复自定义的间隙。
将系统间隙的值设置给最上面的 label:
stackview.setCustomSpacing(UIStackView.spacingUseSystem, after: topLabel)
恢复 stackView 元素的间隙(移除自定义的间隙):
stackview.setCustomSpacing(UIStackView.spacingUseDefault, after: topLabel)
译者注:在设置了 stackView 的 spacing 值为5,设置 customSpacing 的值为10,而后界面调整了,想把自定义间隙恢复为5,那么这时只能调用 setCustomSpacing 将值设置为 spacingUseDefault,若是设置为0,将干掉全部的间隙。这是我理解的 spacingUseDefault 使用场景。