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. I don’t use Interface Builder so I write all my layout in code. 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 })
}
}