Skip to content

Instantly share code, notes, and snippets.

@stevebrun
Last active July 18, 2017 23:57
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save stevebrun/5b85a5eff92df2bfb5da65894f0d28d0 to your computer and use it in GitHub Desktop.
Save stevebrun/5b85a5eff92df2bfb5da65894f0d28d0 to your computer and use it in GitHub Desktop.
AutoLayout using Operators
/// - note: The equivalence operators don't work because `NSObject` implements `Equatable`.
import UIKit
// MARK: Constraint From Anchor
public func == <AnchorType>(constrained: NSLayoutAnchor<AnchorType>, reference: NSLayoutAnchor<AnchorType>) -> NSLayoutConstraint {
return constrained.constraint(equalTo: reference)
}
public func >= <AnchorType>(constrained: NSLayoutAnchor<AnchorType>, reference: NSLayoutAnchor<AnchorType>) -> NSLayoutConstraint {
return constrained.constraint(greaterThanOrEqualTo: reference)
}
public func <= <AnchorType>(constrained: NSLayoutAnchor<AnchorType>, reference: NSLayoutAnchor<AnchorType>) -> NSLayoutConstraint {
return constrained.constraint(lessThanOrEqualTo: reference)
}
// MARK: - Offset Layout Anchors
public struct Partial<AnchorType: AnyObject> {
var anchor: NSLayoutAnchor<AnchorType>
var constant: CGFloat
public static func + (partial: Partial, constant: CGFloat) -> Partial {
var partial = partial
partial.constant += constant
return partial
}
public static func - (partial: Partial, constant: CGFloat) -> Partial {
var partial = partial
partial.constant -= constant
return partial
}
}
public func + <AnchorType>(anchor: NSLayoutAnchor<AnchorType>, constant: CGFloat) -> Partial<AnchorType> {
return Partial(anchor: anchor, constant: constant)
}
public func - <AnchorType>(anchor: NSLayoutAnchor<AnchorType>, constant: CGFloat) -> Partial<AnchorType> {
return Partial(anchor: anchor, constant: -constant)
}
// MARK: - Constraint from Partial
public func == <AnchorType>(constrained: NSLayoutAnchor<AnchorType>, partial: Partial<AnchorType>) -> NSLayoutConstraint {
return constrained.constraint(equalTo: partial.anchor, constant: partial.constant)
}
public func >= <AnchorType>(constrained: NSLayoutAnchor<AnchorType>, partial: Partial<AnchorType>) -> NSLayoutConstraint {
return constrained.constraint(greaterThanOrEqualTo: partial.anchor, constant: partial.constant)
}
public func <= <AnchorType>(constrained: NSLayoutAnchor<AnchorType>, partial: Partial<AnchorType>) -> NSLayoutConstraint {
return constrained.constraint(lessThanOrEqualTo: partial.anchor, constant: partial.constant)
}
// MARK: - Multiplied Layout Dimensions
public struct MultipliedPartial {
var anchor: NSLayoutDimension
var constant: CGFloat
var multiplier: CGFloat
public static func + (partial: MultipliedPartial, constant: CGFloat) -> MultipliedPartial {
var partial = partial
partial.constant += constant
return partial
}
public static func - (partial: MultipliedPartial, constant: CGFloat) -> MultipliedPartial {
var partial = partial
partial.constant -= constant
return partial
}
}
public func * (anchor: NSLayoutDimension, multiplier: CGFloat) -> MultipliedPartial {
return MultipliedPartial(anchor: anchor, constant: 0, multiplier: multiplier)
}
// MARK: - Constraint from MultipliedPartial
extension NSLayoutDimension {
public static func == (constrained: NSLayoutDimension, partial: MultipliedPartial) -> NSLayoutConstraint {
return constrained.constraint(equalTo: partial.anchor, multiplier: partial.multiplier, constant: partial.constant)
}
public static func >= (constrained: NSLayoutDimension, partial: MultipliedPartial) -> NSLayoutConstraint {
return constrained.constraint(greaterThanOrEqualTo: partial.anchor, multiplier: partial.multiplier, constant: partial.constant)
}
public static func <= (constrained: NSLayoutDimension, partial: MultipliedPartial) -> NSLayoutConstraint {
return constrained.constraint(lessThanOrEqualTo: partial.anchor, multiplier: partial.multiplier, constant: partial.constant)
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment