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 }) } }
Discussion in the ATmosphere