Skip to content

Instantly share code, notes, and snippets.

@ksmandersen
Created August 4, 2016 17:56
Show Gist options
  • Save ksmandersen/c22ad30cacb1f1b1847738da5d0e7871 to your computer and use it in GitHub Desktop.
Save ksmandersen/c22ad30cacb1f1b1847738da5d0e7871 to your computer and use it in GitHub Desktop.
public extension UIView {
func alignCenterX(_ constant: CGFloat = 0, multiplier: CGFloat = 1, to view: UIView,
attribute: NSLayoutAttribute = .centerX,
relation: NSLayoutRelation = .equal,
priority: UILayoutPriority = UILayoutPriorityRequired) -> NSLayoutConstraint {
return alignAttribute(attribute: .centerX, relation: relation,
to: view, otherAttribute: attribute,
multiplier: multiplier,
constant: constant, priority: priority)
}
func alignCenterY(_ constant: CGFloat = 0, multiplier: CGFloat = 1, to view: UIView,
attribute: NSLayoutAttribute = .centerY,
relation: NSLayoutRelation = .equal,
priority: UILayoutPriority = UILayoutPriorityRequired) -> NSLayoutConstraint {
return alignAttribute(attribute: .centerY, relation: relation,
to: view, otherAttribute: attribute,
multiplier: multiplier,
constant: constant, priority: priority)
}
func alignCenter(to view: UIView) -> [NSLayoutConstraint] {
return [alignCenterX(to: view), alignCenterY(to: view)]
}
}
public extension UIView {
func alignHeight(_ constant: CGFloat = 0, multiplier: CGFloat = 1, to view: UIView,
attribute: NSLayoutAttribute = .height,
relation: NSLayoutRelation = .equal,
priority: UILayoutPriority = UILayoutPriorityRequired) -> NSLayoutConstraint {
return alignAttribute(attribute: .height, relation: relation,
to: view, otherAttribute: attribute,
multiplier: multiplier,
constant: constant, priority: priority)
}
func constraintHeight(constant: CGFloat) -> NSLayoutConstraint {
return alignAttribute(attribute: .height, relation: .equal, to: nil,
otherAttribute: .height, constant: constant)
}
}
public extension UIView {
func alignWidth(_ constant: CGFloat = 0, multiplier: CGFloat = 1, to view: UIView,
attribute: NSLayoutAttribute = .width,
relation: NSLayoutRelation = .equal,
priority: UILayoutPriority = UILayoutPriorityRequired) -> NSLayoutConstraint {
return alignAttribute(attribute: .width, relation: relation,
to: view, otherAttribute: attribute,
multiplier: multiplier,
constant: constant, priority: priority)
}
func constraintWidth(constant: CGFloat) -> NSLayoutConstraint {
return alignAttribute(attribute: .width, relation: .equal, to: nil,
otherAttribute: .width, constant: constant)
}
}
public extension UIView {
func alignLeading(_ constant: CGFloat = 0, multiplier: CGFloat = 1, to view: UIView,
attribute: NSLayoutAttribute = .leading,
relation: NSLayoutRelation = .equal,
priority: UILayoutPriority = UILayoutPriorityRequired) -> NSLayoutConstraint {
return alignAttribute(attribute: .leading, relation: relation,
to: view, otherAttribute: attribute,
multiplier: multiplier,
constant: constant, priority: priority)
}
func alignTrailing(_ constant: CGFloat = 0, multiplier: CGFloat = 1, to view: UIView,
attribute: NSLayoutAttribute = .trailing,
relation: NSLayoutRelation = .equal,
priority: UILayoutPriority = UILayoutPriorityRequired) -> NSLayoutConstraint {
return alignAttribute(attribute: .trailing, relation: relation,
to: view, otherAttribute: attribute,
multiplier: multiplier,
constant: constant, priority: priority)
}
func alignTop(_ constant: CGFloat = 0, multiplier: CGFloat = 1, to view: UIView,
attribute: NSLayoutAttribute = .top,
relation: NSLayoutRelation = .equal,
priority: UILayoutPriority = UILayoutPriorityRequired) -> NSLayoutConstraint {
return alignAttribute(attribute: .top, relation: relation,
to: view, otherAttribute: attribute,
multiplier: multiplier,
constant: constant, priority: priority)
}
func alignBottom(_ constant: CGFloat = 0, multiplier: CGFloat = 1, to view: UIView,
attribute: NSLayoutAttribute = .bottom,
relation: NSLayoutRelation = .equal,
priority: UILayoutPriority = UILayoutPriorityRequired) -> NSLayoutConstraint {
return alignAttribute(attribute: .bottom, relation: relation,
to: view, otherAttribute: attribute,
multiplier: multiplier,
constant: constant, priority: priority)
}
}
public extension UIView {
func alignAttribute(attribute: NSLayoutAttribute, relation: NSLayoutRelation,
to otherView: UIView? = nil,
otherAttribute: NSLayoutAttribute = .notAnAttribute,
multiplier: CGFloat = 1, constant: CGFloat = 0,
priority: UILayoutPriority = UILayoutPriorityRequired) -> NSLayoutConstraint {
return alignUsing(item: self, attribute, relation, otherView, otherAttribute,
multipler: multiplier, constant: constant, priority: priority)
}
}
private extension UIView {
func alignUsing(item: UIView, _ attribute: NSLayoutAttribute, _ relation: NSLayoutRelation,
_ otherItem: UIView? = nil,
_ otherAttribute: NSLayoutAttribute = .notAnAttribute,
multipler: CGFloat = 1, constant: CGFloat = 0,
priority: UILayoutPriority = UILayoutPriorityRequired) -> NSLayoutConstraint {
let constraint = NSLayoutConstraint(item: item, attribute, relation, otherItem,
otherAttribute, multipler: multipler,
constant: constant, priority: priority)
addConstraint(constraint)
return constraint
}
}
private extension NSLayoutConstraint {
convenience init(item: UIView, _ attribute: NSLayoutAttribute, _ relation: NSLayoutRelation,
_ otherItem: UIView? = nil, _ otherAttribute: NSLayoutAttribute = .notAnAttribute,
multipler: CGFloat = 1, constant: CGFloat = 0,
priority: UILayoutPriority = UILayoutPriorityRequired) {
self.init(item: item, attribute: attribute, relatedBy: relation, toItem: otherItem,
attribute: otherAttribute, multiplier: multiplier, constant: constant)
self.priority = priority
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment