SnapLayout 2.1.0

SnapLayout 2.1.0

测试已测试
语言语言 SwiftSwift
许可 MIT
发布最新发布2020年6月
SPM支持SPM

Snap Layout维护。



  • 作者
  • Satinder Singh

SnapLayout

Build Status Coverage Status Version Carthage compatible Platform License

简洁的自动布局API。SnapLayout扩展了UIViewNSView,提供了一系列API来提高可读性,同时缩短约束代码。内部使用自动布局以提供最佳体验。使用SnapLayout,开发者可以删除样板代码,但并不会牺牲可读性。

想象一下,将以下一个或所有约束在代码的同一行中应用于视图:顶部、左侧、右侧、底部、宽度、高度、中心X、中心Y。不够吗?开始链式调用snap调用,以支持相邻snap。这一切都是通过SnapLayout实现的。

为什么用它?

让我们用一个现实世界的例子来说明。假设需要添加以下视图。它有一个中心点X、中心点Y、宽度以及高度限制。

SnapLayout

苹果:

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文件。