Constrainer is meant to be a lightweight AutoLayout helper. Constrainer exposes several properties on UIView
that can be used to construct layout constraints using operators. This mostly was an experiment to see how much of Cartography's functionality can be replicated without using proxies only accessible in closures and the syntax of Constrainer is this heavily inspired by Cartography.
view.leading == imageView.trailing - 20
label.edges <= labelContainerView.margins.edges
let widthConstraint = view.width >= imageView.height / 2 ~ .defaultLow
All expressions return a NSLayoutConstraint
(or an array of NSLayoutConstraint
when using edges
or center
), which can be stored and used to modify / deactivate the constraint at a later point.
All available properties to construct constraints using Constrainer are:
top
bottom
leading
trailing
width
height
left
right
centerY
centerX
firstBaseline
lastBaseline
edges
center
If the constraints should be relative to margins or safe areas all of the above properties are also available on the UIView.margins
and UIView.safeArea
properties.
A UILayoutPriority
can be set for the constraint using the ~
operator.
view.leading == imageView.trailing ~ .defaultHight
label.edges >= labelContainerView.edges ~ 750
Edges can be inset using CGFloat
values or UIEdgeInset
values.
label.edges >= labelContainerView.edges + UIEdgeInsets(top: 12, left: 16, bottom: -8, right: -42)
labelContainerView.edges == view.safeArea.edges - 50
Constrainer was heavily influenced by Cartography, which has a similar API but instead of exposing properties to construct constraints on the view directly it provides proxy objects inside a closure.
One main disadvantage of exposing properties with such common names directly on the view itself is potential namespace pollution (and collision), for example visible when looking at the center
proxy in Constrainer, which (depending on the exact expression) might resolve to the UIView.center
of type CGPoint
provided by UIKit
. If this happens it can be resolved by explicitly using the UIView.anchors
proxy object.