Skip to content

Instantly share code, notes, and snippets.

@gfpacheco
Created July 26, 2021 20:04
Show Gist options
  • Save gfpacheco/2e3601e50bf6789ddba98932c9dd959e to your computer and use it in GitHub Desktop.
Save gfpacheco/2e3601e50bf6789ddba98932c9dd959e to your computer and use it in GitHub Desktop.
UIView extension that makes it easier to write auto layout constraints
import UIKit
extension UIView {
func inset(into view: UIView, allSides: CGFloat = 0) -> [NSLayoutConstraint] {
inset(into: view, horizontal: allSides, vertical: allSides)
}
func inset(into view: UIView, horizontal: CGFloat? = nil, vertical: CGFloat? = nil) -> [NSLayoutConstraint] {
inset(into: view, leading: horizontal, trailing: horizontal, top: vertical, bottom: vertical)
}
func inset(
into view: UIView,
leading: CGFloat? = nil,
trailing: CGFloat? = nil,
top: CGFloat? = nil,
bottom: CGFloat? = nil
) -> [NSLayoutConstraint] {
var constraints = [NSLayoutConstraint]()
if let leading = leading {
constraints.append(leadingAnchor.constraint(equalTo: view.leadingAnchor, constant: leading))
}
if let trailing = trailing {
constraints.append(trailingAnchor.constraint(equalTo: view.trailingAnchor, constant: -trailing))
}
if let top = top {
constraints.append(topAnchor.constraint(equalTo: view.topAnchor, constant: top))
}
if let bottom = bottom {
constraints.append(bottomAnchor.constraint(equalTo: view.bottomAnchor, constant: -bottom))
}
return constraints
}
func next(to view: UIView, horizontal: CGFloat? = nil, vertical: CGFloat? = nil) -> [NSLayoutConstraint] {
var constraints = [NSLayoutConstraint]()
if let horizontal = horizontal {
constraints.append(leadingAnchor.constraint(equalTo: view.trailingAnchor, constant: horizontal))
}
if let vertical = vertical {
constraints.append(topAnchor.constraint(equalTo: view.bottomAnchor, constant: vertical))
}
return constraints
}
}
@gfpacheco
Copy link
Author

This allows me to write:

titleLabel.inset(into: view, leading: 16, trailing: 16, top: 16) +
    descriptionLabel.inset(into: view, horizontal: 16) +
    descriptionLabel.next(to: titleLabel, vertical: 8) +
    stackView.inset(into: view, leading: 16, trailing: 16, bottom: 16) +
    stackView.next(to: descriptionLabel, vertical: 16)

Instead of:

[
    titleLabel.leadingAnchor.constraint(equalTo: view.leadingAnchor, constant: 16),
    titleLabel.trailingAnchor.constraint(equalTo: view.trailingAnchor, constant: -16),
    titleLabel.topAnchor.constraint(equalTo: view.topAnchor, constant: 16),

    descriptionLabel.leadingAnchor.constraint(equalTo: view.leadingAnchor, constant: 16),
    descriptionLabel.trailingAnchor.constraint(equalTo: view.trailingAnchor, constant: -16),
    descriptionLabel.topAnchor.constraint(equalTo: titleLabel.bottomAnchor, constant: 16),

    stackView.leadingAnchor.constraint(equalTo: view.leadingAnchor, constant: 16),
    stackView.trailingAnchor.constraint(equalTo: view.trailingAnchor, constant: -16),
    stackView.topAnchor.constraint(equalTo: descriptionLabel.bottomAnchor, constant: 16),
    stackView.bottomAnchor.constraint(equalTo: view.bottomAnchor, constant: -16)
]

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