🔗 JSConstraints
💡 一个专为 **Blazin' Fast Programmatic Constraints-Typing** 而编写的迷你 Swift 库。
JSConstraints 是一个扩展了 UIView
和 UIStackView
功能性的小型库。
目录
📥 安装
JSConstraints 可以通过 CocoaPods 和 Swift 包管理器 获取。
Cocoapods
通过 Cocoapods 安装,只需在 Podfile 中添加以下行
pod 'JSConstraints'
Swift 包管理器
使用 SPM?在 Xcode 项目中,选择 文件 > Swift 包 > 添加依赖项 并粘贴以下 URL。
https://github.com/jaysack/JSConstraints
📓 工作原理?
JSConstraints 移除了在创建编程约束时所需的所有不必要的样板代码。
只需使用以下方法之一来约束任何视图
setConstraints()
centerIn()
pintTo()
// Default
foo.setConstraints([ .top(view.topAnchor) ])
// Shortcut
foo.🔗([ .top(view.topAnchor) ])
导入库
首先,导入库
import JSConstraints
方块
.square()
枚举表达式非常直观,允许您创建“方形”视图。它将宽度和高度都设置为提供的值。
pinkSquare.setConstraints([ .square(185) ])
刚才发生了什么?
我们将 width
和 height
的约束条件都设置为 185
。
方向约束
// 1. Add to superview
view.addSubview(pinkSquare)
// 2. Set constraints
pinkSquare.setConstraints([
.leading(view.leadingAnchor),
.bottom(view.bottomAnchor) + .constant(18)
])
刚才发生了什么?
- 我们将
pinkSquare
的约束条件设置为与其上级视图的左侧锚点对齐。
let leadingConstraint = .leading(view.leadingAnchor)
- 然后我们将
pinkSquare
再次约束,使其距离上级视图底部锚点18个点。
let bottomConstraint = .bottom(view.bottomAnchor) + .constant(18)
重构格式
让我们将这些放在一起,得到
// Add pink square to superview
view.addSubview(pinkSquare)
// Set constraints
pinkSquare.🔗([ bottomConstraint, leadingConstraint ])
💡 常数参数是可选的,如果没有提供,则用0替换。
相对约束
indigoView.setConstraints([
.relWidth(view.widthAnchor) * .multiplier(0.4),
.relHeight(pinkSquare.heightAnchor) * .multiplier(1.18)
])
// We're assuming here that the indigo view's in already in
// its superview's stack and has been constrained from its top and right sides.
刚刚发生了什么?
我们将indigoView
的宽度设置为view
宽度的0.4倍。
我们还设置了indigoView
的宽度比我们的pinkSquare
略高。
💡 multiplier
参数是可选的,如果没有提供,则默认为1。
对齐视图
yellowCircle.centerIn(superview: self.view)
刚刚发生了什么?
我们在屏幕中央约束了yellowCircle
。
固定到父视图
indigoView.pinTo(superview: self.view, withPadding: 18)
⚠️ UILayoutGuide
的情况如何?
根据您的需求,您可以选择将视图固定到ViewController的view
或其layoutGuide
上,因为两者都受到JSConstraints的支持。
使用layoutGuide
会自动将子视图添加到布局指南的拥有者视图中。
indigoView.pinTo(layoutGuide: view.safeAreaLayoutGuide)
// Indigo view was automatically added to `view` subviews
♻️ 动态约束如何?
JSConstraints方法总是返回成功激活的约束集合。
我们可以用它来在active
和inactive
状态之间切换。
1. 获取活动约束
// Save returned constraints
var pinkOptionalConstraints = pinkSquare.setConstraints([ bottomConstraint, leadingConstraint ])
var indigoOptionalConstraints = indigoView.setConstraints([ topConstraint, trailingConstraint ])
// Append to array of dynamic constraints
dynamicConstraints.append(contentsOf: pinkOptionalConstraints)
dynamicConstraints.append(contentsOf: indigoOptionalConstraints)
这里,返回了类型为 [NSLayoutConstraint]
的活动约束列表。我们可以将结果保存在 dynamicConstraints
变量中。
2. 更新约束
// Deactivate optional constraints
dynamicConstraints.forEach { $0.isActive = false }
// Set new constraints
[pinkSquare, indigoView].forEach { $0.centerIn(superview: view) }
在此,我们将可选约束停用,然后添加新约束。
3. 动画
✉️ 作者
Jonathan Sack
[邮箱地址 removed]
🔏 许可证
版权所有 © 2020 Jonathan Sack
以下条件下,任何获得此软件及其相关文档文件(“软件”)副本的人,均免费获得在此软件上不受限制的权限,包括但不限于使用、复制、修改、合并、发布、分发、再许可和/或出售软件副本,以及允许将软件提供给他人使用,前提是遵守以下条件
上述版权声明和本许可声明应包含在软件的所有副本或主要部分中。
本软件按“现状”提供,不提供任何明示或暗示的担保,包括但不限于适销性、适用于特定目的和非侵权性担保。在任何情况下,均不承担作者或版权所有者由于合同、侵权或其他方式而产生的任何索赔、损害或其他责任,无论是由于软件或其使用或其他方式引起的。