Skip to content

Instantly share code, notes, and snippets.

@harlanhaskins
Last active March 5, 2017 03:27
Show Gist options
  • Star 2 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save harlanhaskins/a5ac3242dac7dda5bce6 to your computer and use it in GitHub Desktop.
Save harlanhaskins/a5ac3242dac7dda5bce6 to your computer and use it in GitHub Desktop.
extension UIView {
func constraintsEqualToSuperview(_ edgeInsets: UIEdgeInsets = UIEdgeInsets.zero, priority: UILayoutPriority = 1000) -> [NSLayoutConstraint] {
self.translatesAutoresizingMaskIntoConstraints = false
var constraints = [NSLayoutConstraint]()
if let superview = self.superview {
constraints.append(self.constraining(.leading, .equal, to: superview, constant: edgeInsets.left, priority: priority))
constraints.append(self.constraining(.trailing, .equal, to: superview, constant: -edgeInsets.right, priority: priority))
constraints.append(self.constraining(.top, .equal, to: superview, constant: edgeInsets.top, priority: priority))
constraints.append(self.constraining(.bottom, .equal, to: superview, constant: -edgeInsets.bottom, priority: priority))
}
return constraints
}
func constraining(_ attribute: NSLayoutAttribute, _ relation: NSLayoutRelation, to constant: CGFloat, multiplier: CGFloat = 1.0, priority: UILayoutPriority = 1000) -> NSLayoutConstraint {
self.translatesAutoresizingMaskIntoConstraints = false
let constraint = NSLayoutConstraint(item: self, attribute: attribute, relatedBy: relation, toItem: nil, attribute: .notAnAttribute, multiplier: multiplier, constant: constant)
constraint.priority = priority
return constraint
}
func constraining(_ attribute: NSLayoutAttribute, _ relation: NSLayoutRelation, to otherAttribute: NSLayoutAttribute, of item: AnyObject? = nil, multiplier: CGFloat = 1.0, constant: CGFloat = 0.0, priority: UILayoutPriority = 1000) -> NSLayoutConstraint {
self.translatesAutoresizingMaskIntoConstraints = false
let constraint = NSLayoutConstraint(item: self, attribute: attribute, relatedBy: relation, toItem: item ?? self, attribute: otherAttribute, multiplier: multiplier, constant: constant)
constraint.priority = priority
return constraint
}
func constraining(_ attribute: NSLayoutAttribute, _ relation: NSLayoutRelation, to item: AnyObject, multiplier: CGFloat = 1.0, constant: CGFloat = 0.0, priority: UILayoutPriority = 1000) -> NSLayoutConstraint {
self.translatesAutoresizingMaskIntoConstraints = false
let constraint = NSLayoutConstraint(item: self, attribute: attribute, relatedBy: relation, toItem: item, attribute: attribute, multiplier: multiplier, constant: constant)
constraint.priority = priority
return constraint
}
func constraining(_ attributes: [NSLayoutAttribute], _ relation: NSLayoutRelation, to item: AnyObject, multiplier: CGFloat = 1.0, constant: CGFloat = 0.0, priority: UILayoutPriority = 1000) -> [NSLayoutConstraint] {
return attributes.map { self.constraining($0, relation, to: item, multiplier: multiplier, constant: constant, priority: priority) }
}
func constraining(_ attributes: [NSLayoutAttribute], _ relation: NSLayoutRelation, to constant: CGFloat, multiplier: CGFloat = 0.0, priority: UILayoutPriority = 1000) -> [NSLayoutConstraint] {
return attributes.map { self.constraining($0, relation, to: constant, multiplier: multiplier, priority: priority) }
}
func constraints(size: CGSize) -> [NSLayoutConstraint] {
return [
constraining(.width, .equal, to: size.width),
constraining(.height, .equal, to: size.height)
]
}
}
extension NSLayoutConstraint {
class func constraints(format: String, options: NSLayoutFormatOptions = NSLayoutFormatOptions(), metrics: [String: Any]? = nil, views: [String: Any] = [:]) -> [NSLayoutConstraint] {
return NSLayoutConstraint.constraints(withVisualFormat: format, options: options, metrics: metrics, views: views)
}
}
@harlanhaskins
Copy link
Author

harlanhaskins commented Aug 3, 2015

Usage:

NSLayoutConstraint.activate(subview.constraintsEqualToSuperview())
subview.constraining(.height, .equal, to: 25.0).isActive = true
subview2.constraining(.height, .lessThanOrEqual, to: subview).isActive = true
NSLayoutConstraint.activate(
  subview3.constraining([.width, .centerY], equal, to: subview))

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment