BBLayoutKit

一个简单轻量级的 Auto-Layout 工具包,让您感觉像在玩有趣的游戏一样进行视图布局。BBLayoutKit 支持 iOS & tvOS 上的 UIKit 和 MacOS 上的 AppKit,因此您不必担心在不同的平台上使用不同的解决方案。BBLayoutKit 在 Xcode 12.0 上使用 Swift 5.3 编译,并将为所有未来的版本进行更新。

Platform Language Swift version License

为什么要使用 BBLayoutKit?

您是否曾经需要编写一行又一行的代码来添加子视图并像下面这样锚定它们?

view.addSubview(subview)
subview.translatesAutoresizingMaskIntoConstraints = false

subview.topAnchor.constraint(equalTo: view.bottomAnchor).isActive = true
...
subview.trailingAnchor.constraint(equalTo: view.trailingAnchor).isActive = true

不用担心,BBLayoutKit 可以帮助您解决这种情况,如下所示:

view.addSubview(subview) {
    subview.top      == view.bottom
    ...
    subview.trailing == view.trailing
}
// Or in short 🙂
view.addSubview(subview) { $0.sides == $1.sides }

// Or even shorter 😎
view.addSubview(subview) { $0 === $1 } 

您看,这就是所需的全部。现在,您可能想知道,如果必须创建一个关系不是“等于”而是“小于”或“大于”的约束,该怎么办? 就像这样:

subview.leadingAnchor.constraint(lessThanOrEqualTo: view.leadingAnchor, constant: -8).isActive = true
subview.trailingAnchor.constraint(greaterThanOrEqualTo: view.trailingAnchor: constant: 16).isActive = true

BBLayoutKit 可以让您这样做:

subview.leading  <= view.leading
subview.trailing >= view.trailing

对于常量,您可以在同一个表达式中添加或减去它们,因此,代替这样:

subview.topAnchor.constraint(equalTo: view.bottomAnchor, constant: 16).isActive = true
subview.leadingAnchor.constraint(equalTo: view.leadingAnchor, constant: -32).isActive = true

您只需要这样: subview.top == view.bottom + 16 subview.leading == view.trailing - 32 如果您想获得用于动画或将来引用的约束,只需这样做:

let subviewTopConstraint      = subview.top == view.bottom + 16
subviewTopConstraint.constant = 32

如果您不希望约束在第一次启动时处于活动状态,只需使用 '!=' 甚至 '!<=' 和 '!>=',如下所示:

subview.top      != view.bottom
subview.leading  !<= view.leading
subview.trailing !>= view.trailing

对于像高度或宽度这样的尺寸:

subview.widthAnchor.constraint(equalTo: view.widthAnchor, multiplier: 2, constant: 8).isActive = true
subview.heightAnchor.constraint(equalToConstant: 64).isActive = true

您只需要这样:

subview.width  == view.width * 2 + 8
subview.height == 64

对于 addSubview 和 translatesAutoresizingMaskIntoConstraints = false,您可以简单地编写一个闭包,如下所示:

view.addSubview(subview) {
  subview.sides <= view.sides
}

您还有其他的辅助方法,例如包含所有边的 sides,以及接收 CGSize 的 size,以及水平和垂直约束以及居中。

// Constraint all sides with a padding of 2
subview.sides == view.sides + 2

// Constraint all sides with different padding on each side.
subview.sides == view.sides + UIEdgeInsets(t: 1, l: 2, b: 4, r: 8)

// Align both centers of view and subview
subview.centers == view.centers

// Constraint both centers with offsets 4 and 8.
subview.centers == view.centers + UIOffset(x: 4, y: 8)

// Constraint vertical(top and bottom) or horizontal(leading and trailing)
subview.vertical   == view.vertical
subview.horizontal == view.horizontal

// Constraint size either with CGSize or both sides 64
subview.size == CGSize(w: 8, h: 16)
subview.size == 64

安装

Swift Package Manager

Swift Package Manager 是一种用于自动化 Swift 代码分发的工具,并已集成到 swift 编译器中。 它还处于早期开发阶段,但 BBLoader 确实支持在受支持的平台上使用它。

设置好 Swift 包后,将 BBLoader 添加为依赖项就像将其添加到 Package.swiftdependencies 值一样容易。

dependencies: [
    .package(url: "https://github.com/bibinjacobpulickal/BBLayoutKit.git", .upToNextMajor(from: "1.0.0"))
]

从 Xcode 11.0+ 开始,您只需要提供上述 URL。

特性

要求

许可证

BBLayoutKit 在 MIT 许可证下发布。
有关详细信息,请参阅LICENSE