AutoLayoutProxy

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

Platform Platform Language Swift version Swift License

为什么使用 AutoLayoutProxy?

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

view.addSubview(subview)
subview.translatesAutoresizingMaskIntoConstraints = false

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

AutoLayoutProxy v4 引入了声明式 UI 布局语法

view.addSubview(subview) {
    subview.top.equalTo(view.top).constant(16)
    $0.leading.lessThanOrEqualTo($1.leading).constant(16)
    $0.height.equalTo(100)
    $0.width.greaterThanOrEqualTo($1.width).multiplier(0.8).constant(-12)
}

不用担心,AutoLayoutProxy 帮助您解决如下情况:

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

AutoLayoutProxy 允许您这样做:

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,包含所有边;以及 size,它接受一个 CGSize,以及水平和垂直约束以及居中。

// 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/AutoLayoutProxy.git", .upToNextMajor(from: "4.0.0"))
]

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

注意:不再需要提供上述 URL。 您可以在 Xcode 中搜索 AutoLayoutProxy 包。

功能

支持

许可

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