Last active
July 18, 2017 23:57
-
-
Save libsteve/5b85a5eff92df2bfb5da65894f0d28d0 to your computer and use it in GitHub Desktop.
AutoLayout using Operators
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
/// - 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