一种优雅简单的构建自动布局约束的方法。
您可以使用 SwiftLayoutKit 通过表达视图布局属性的相互关系或使用视觉格式语言来生成自动布局约束。
请注意,SwiftLayoutKit 不会将视图的 setTranslatesAutoresizingMaskIntoConstraints
设置为 false
,也不会为您自动安装约束。
图 1:SwiftLayoutKit UML 类图
将 SwiftLayoutKit
文件夹的内容复制到您的项目中
LayoutAttribute.swift
AutoLayoutAttribute.swift
Layout.swift
LayoutOperators.swift
ViewExtensions.swift
SwiftLayoutKit 支持所有可用的布局属性,包括随 iOS 8 引入的新属性。
要开始使用,在您的 UIView
实例上调用 attribute
方法,然后传入您希望使用的 NSLayoutAttribute
类型,例如
...
// let's assume that boxView is a subview of view
boxView.attribute(.Width) == 200
boxView.attribute(.Height) == 200
boxView.attribute(.CenterX) == view.attribute(.CenterX)
boxView.attribute(.CenterY) == view.attribute(.CenterY)
...
上面的代码将生成四个约束,但不会将它们添加到父视图的约束中。我们可以使用自定义的 添加约束 操作符 +|
来将生成的约束添加到父视图
...
view +| boxView.attribute(.Width) == 200
view +| boxView.attribute(.Height) == 200
view +| boxView.attribute(.CenterX) == view.attribute(.CenterX)
view +| boxView.attribute(.CenterY) == view.attribute(.CenterY)
...
您不必强制使用 +|
操作符,也可以在父视图上调用 addConstraint
方法
...
view.addConstraint( boxView.attribute(.Width) == 200 )
...
有时使用视觉格式语言生成约束更容易更快。SwiftLayoutKit 附带了一个用于 NSLayoutConstraint.constraintsWithVisualFormat
类方法的辅助包装函数。此函数期望一个视觉格式字符串,并包含一个按视图组织的字典,并将 选项 和 度量 作为可选参数
...
let views = ["title": titleLabel]
let constraints = constraintsWith(format: "|-[title]-|", forViews: views)
...
以下函数允许您通过给定的 NSLayoutAttribute
对齐多个视图到一个视图
...
let constraints = constraintsWith(align: .CenterY, toView: parentView, forViews: viewA, viewB)
...
上述代码将设置 viewA
和 viewB
的 CenterY
属性与 parentView
的 CenterY
属性相等。
以下是所有 SwiftLayoutKit 运算符的列表
运算符 | 描述 |
---|---|
+| | 向一个视图添加约束 |
~ | 设置左布局属性上的约束优先级 |
== | 生成两个布局属性之间或属性与数字之间具有等量关系的约束 |
>= | 生成两个布局属性之间或属性与数字之间具有大于或等于关系的约束 |
<= | 生成两个布局属性之间或属性与数字之间具有小于或等于关系的约束 |
+ | 将约束常量增加一个特定的数字 |
- | 将约束常量减少一个特定的数字 |
* | 将约束乘数设置为一个特定的数字 |
/ | 将约束乘数除以一个特定的数字(默认乘数设置为 1) |
...
view +| viewA.attribute(.Width) == 200
view +| viewA.attribute(.Height) ~ 600 == 50
view +| viewA.attribute(.Top) ~ 500 == viewB.attribute(.Top) + 20
view +| viewA.attribute(.Leading) == viewB.attribute(.Trailing) / 2 + 40
view +| viewC.attribute(.Top) == viewB.attribute(.Top) * 2 - 10
view +| viewC.attribute(.CenterX) == viewB.attribute(.CenterX)
view +| viewC.attribute(.Width) >= viewB.attribute(.Width)
view +| viewC.attribute(.Height) <= 200
...
是的,你可以在 SwiftLayoutKitTests
文件夹中找到它们。
该项目受到了 Robb Böhnke 在 Cartography 上的工作的启发。
SwiftLayoutKit 在 MIT 许可下发布。有关更多信息,请参阅 LICENSE.txt 文件。