Overload NSLayoutConstraint.activate to Accept Arrays as Elements
Using anchors with Auto Layout is a big improvement over creating constraints using the class function in NSLayoutConstraint
or Visual Format Language. You also write your own wrappers to make creating multiple constraints easier, e.g one might write a function like NSLayoutConstraint.constraint(views:toSameWidth:)
or NSLayoutConstraint.constraint(views:toSquareWithSides:)
, both returning an array.
Or sometimes, in a more dynamic piece of UI, you might need to swap around arrays of constraints.
I find it useful to define a protocol and a few extensions so that this can be done:
NSLayoutConstraint.activate([
constraintsArray1,
constraintsArray2,
constraint3,
constraint4,
constraint5,
])
Alternatives involve appending of arrays which ends up with code that is hard to indent.
So there you go:
protocol LayoutConstraintsWrapper {
var constraints: [NSLayoutConstraint] { get }
}
extension Array: LayoutConstraintsWrapper where Element: NSLayoutConstraint {
var constraints: [NSLayoutConstraint] {
return self
}
}
extension NSLayoutConstraint: LayoutConstraintsWrapper {
var constraints: [NSLayoutConstraint] {
return [self]
}
}
extension NSLayoutConstraint {
class func activate(_ constraints: [LayoutConstraintsWrapper]) {
activate(constraints.flatMap { $0.constraints })
}
}