简洁的自动布局API。SnapLayout扩展了UIView
和NSView
,提供了一系列API来提高可读性,同时缩短约束代码。内部使用自动布局以提供最佳体验。使用SnapLayout,开发者可以删除样板代码,但并不会牺牲可读性。
想象一下,将以下一个或所有约束在代码的同一行中应用于视图:顶部、左侧、右侧、底部、宽度、高度、中心X、中心Y。不够吗?开始链式调用snap调用,以支持相邻snap。这一切都是通过SnapLayout
实现的。
为什么用它?
让我们用一个现实世界的例子来说明。假设需要添加以下视图。它有一个中心点X、中心点Y、宽度以及高度限制。
苹果:
squareView.translatesAutoresizingMaskIntoConstraints = false
squareView.widthAnchor.constraint(equalToConstant: 50)
squareView.heightAnchor.constraint(equalToConstant: 50)
squareView.centerXAnchor.constraint(equalTo: squareSuperview.centerXAnchor, constant: 0)
squareView.centerYAnchor.constraint(equalTo: squareSuperview.centerYAnchor, constant: 0)
SnapLayout
squareView.snap(width: 50, height: 50, centerX: 0, centerY: 0)
SnapLayout 处理 translatesAutoresizingMaskIntoConstraints
并在应用约束时引用 squareView
的父视图。设计得既灵活又易于阅读。
设置
要求
- Xcode
- 语言支持:Swift (5.0)
- 完全兼容:Xcode 10.0 及以上版本
- iPhone
- 完全兼容:iPhone 9.0 及以上版本
- macOS
- 完全兼容:macOS 10.11 及以上版本
- tvOS
- 完全兼容:tvOS 9.0 及以上版本
CocoaPods 安装
使用pod "SnapLayout"
Carthage
使用github "pokanop/SnapLayout"
使用方法
概述
- 所有方法都以
snap
前缀开头,以便快速进行Xcode自动补全。 - 底层直接使用NSLayoutAnchor,因此API对开发者来说非常友好
- 使用
SnapLayout
的任何视图不仅将translatesAutoresizingMaskIntoConstraints
设置为false
,而且还激活了其约束。 - Snap提供了许多默认参数,包括
view
输入参数。如果没有提供视图参数,则假定您的视图将与其父视图对齐。 - 强大的API支持相邻视图的吸附功能
方法
func snap(to view: View? = nil, top: CGFloat? = nil, leading: CGFloat? = nil, bottom: CGFloat? = nil, trailing: CGFloat? = nil, width: CGFloat? = nil, height: CGFloat? = nil, centerX: CGFloat? = nil, centerY: CGFloat? = nil, priority: LayoutPriority = LayoutPriorityRequired, isActive: Bool = true) -> SnapManager
func snap(to view: View? = nil, config: SnapConfig, priority: LayoutPriority = LayoutPriorityRequired, isActive: Bool = true) -> SnapManager
func snapWidth(to view: View, multiplier: CGFloat = 1, priority: LayoutPriority = LayoutPriorityRequired, isActive: Bool = true) -> SnapManager
func snapHeight(to view: View, multiplier: CGFloat = 1, priority: LayoutPriority = LayoutPriorityRequired, isActive: Bool = true) -> SnapManager
func snap(size: CGSize, priority: LayoutPriority = LayoutPriorityRequired, isActive: Bool = true) -> SnapManager
func snap(trailingView: View, constant: CGFloat = 0, centerY: CGFloat? = nil, priority: LayoutPriority = LayoutPriorityRequired, isActive: Bool = true) -> SnapManager
func snap(leadingView: View, constant: CGFloat = 0, centerY: CGFloat? = nil, priority: LayoutPriority = LayoutPriorityRequired, isActive: Bool = true) -> SnapManager
func snap(bottomView: View, constant: CGFloat = 0, centerX: CGFloat? = nil, priority: LayoutPriority = LayoutPriorityRequired, isActive: Bool = true) -> SnapManager
func snap(topView: View, constant: CGFloat = 0, centerX: CGFloat? = nil, priority: LayoutPriority = LayoutPriorityRequired, isActive: Bool = true) -> SnapManager
示例代码
let buttonSnapManager = button.snap(top: 50, leading: 50, trailing: 50, width: 30)
buttonSnapManager.top?.constant = 100
该按钮不仅将其父视图应用了4个约束,而且每个单独的约束都可以通过返回的SnapManager
类型访问。SnapLayout的美丽之处不仅在于其强大的API接口,还在于调整约束的容易程度。其他API只需返回一个数组,但SnapLayout不同。每个约束都被精心打包成一个SnapManager
。
相邻视图快速定位
button1.snap(trailingView: button2, constant: 8)
这些按钮现在并排排列,其中button2是跟随视图。开发者不再需要思考哪个跟随约束应该应用到哪个前导约束上。这保持了代码的简洁性和清晰性。
链式
let snapManager = view.snap(top: 8, leading: 8, width: 50)
.snapHeight(to: superview, multiplier: 0.5)
print(snapManager.top?.constant) # 8.0
print(snapManager.height?.constant) # 0.5
快照调用也可以成链,并继续返回 快照管理器
。
配置
还提供了一个SnapConfig
结构体,开发者在之前可以将所有的约束常量列出来,并将此类型提供给snap方法参数。
let config = SnapConfig(top: 50, leading: 50, trailing: 50, width: 30, centerX: 0)
button.snap(config: config)
优先级
SnapLayout假定所需的优先级(默认与Apple相同)除非为这些创建的约束指定了其他值。
button1.snap(trailingView: button2, constant: 8, priority: .low)
在以下示例中,顶部、leading、底部和trailing约束都具有所需的优先级;然而,高度约束具有UILayoutPriority.defaultHigh
优先级。就这样!
rectangleView.snap(top: 48, leading: 16, bottom: 16, trailing: 16)
.snap(height: 40, priority: .defaultHigh)
是否激活
SnapLayout 默认情况下激活它创建的所有约束;但是,可以通过向 isActive
传递 false 来禁用此功能。
button1.snap(trailingView: button2, constant: 8, isActive: false)
调试
SnapLayout如果没有正确应用 snaps,也会在日志中打印错误。
SnapLayout Error - No constraint was applied for view: <UIView: 0x7fcb8f4031d0; frame = (0 0; 0 0); layer = <CALayer: 0x608000036320>>
安全区域布局指南支持
SnapLayout会在APP运行iOS 11时使用safeAreaLayoutGuide
应用约束条件;否则,它将直接应用视图的布局锚点。
示例应用
要运行示例项目,请运行 pod try SnapLayout
。
此示例项目不仅包含一个Example-iOS
目标,还包含一个Example-MacOS
目标。这为您更好地了解该库提供了很好的入门途径。
博客
作者
桑迪尔·辛格,[email protected]
许可协议
SnapLayout 在MIT许可协议下可用。有关更多信息,请参阅LICENSE文件。