AceLayout
AceLayout provides a Swifty DSL for Auto Layout.
Requirements
- iOS 9.0+ / macOS 10.11+ / tvOS 9.0+
- Xcode 14+
- Swift 5.7+
Features
- Strongly typed.
- The compiler does not accept wrong constraints such as
some.top == another.leading
.
- The compiler does not accept wrong constraints such as
- Simple, modern and unmistakable APIs.
- No need to write boilerplates.
view.translatesAutoresizingMaskIntoConstraints = false
constraint.isActive = true
Usage
Basic
Constraints Building
Call the autoLayout
method of your UIView
, UILayoutGuide
, NSView
or NSLayoutGuide
with a closure that describes Auto Layout constraints.
view.autoLayout { item in
item.top.equal(to: anotherView, plus: 16) // to UIView
item.bottom.equalToSuperview() // to superview
item.leading.equal(to: layoutMarginsGuide) // to UILayoutGuide
item.trailing.equal(to: anotherView.centerXAnchor) // to NSLayoutAnchor
item.width.equal(to: 100) // to constant
item.height.equal(to: item.width) // to LayoutAnchor
}
In the example, the followings are done automatically:
-
Set
view.translatesAutoresizingMaskIntoConstraints
tofalse
. -
Activates all constraints.
Relations
view.autoLayout { item in
item.top.greaterThanOrEqual(to: safeAreaLayoutGuide)
item.bottom.lessThanOrEqualToSuperview()
}
Priority
UILayoutPriority
and NSLayoutConstraint.Priority
are available.
view.autoLayout { item in
item.center.equalToSuperview().priority(.required)
item.size.equal(toSquare: 100).priority(.defaultHigh)
}
Deactivated Constraints
You can specify an argument activates
to determine whether to immediately activate constraints.
let constraints = view.autoLayout(activates: false) { item in
item.edges.equal(to: anotherView)
}
// All constraints are not active.
assert(constraints.allSatisfy { !$0.isActive })
// You can activate them at any time.
NSLayoutConstraint.activate(constraints)
Convenient Anchors
Point
view.autoLayout { item in
item.center.equal(to: anotherView)
item.topLeading.equalToSuperview()
}
Size
view.autoLayout { item in
item.size.equal(to: CGSize(width: 100, height: 200))
}
HorizontalEdges and VerticalEdges
view.autoLayout { item in
item.leadingTrailing.equal(to: anotherView)
item.topBottom.equalToSuperview(insetBy: 16)
}
Edges
view.autoLayout { item in
item.edges.equalToSuperview(insetBy: 16)
}
Available Anchors
XAxis
leading
trailing
left
right
centerX
YAxis
top
bottom
centerY
UIView
/ NSView
)
Baseline (only firstBaseline
lastBaseline
Dimension
width
height
Point
center
topLeading
topTrailing
topLeft
topRight
bottomLeading
bottomTrailing
bottomLeft
bottomRight
Size
size
HorizontalEdges
leadingTrailing
leftRight
VerticalEdges
topBottom
Edges
edges
Using AceLayout in your project
To use the AceLayout
library in a SwiftPM project, add the following line to the dependencies in your Package.swift
file:
.package(url: "https://github.com/jrsaruo/AceLayout", from: "1.1.1"),
and add AceLayout
as a dependency for your target:
.target(name: "<target>", dependencies: [
.product(name: "AceLayout", package: "AceLayout"),
// other dependencies
]),
Finally, add import AceLayout
in your source code.