Skip to content

Instantly share code, notes, and snippets.

@koingdev
Created May 1, 2019 14:41
Show Gist options
  • Save koingdev/c63a3b3ea5012e378cca16b69994c2d5 to your computer and use it in GitHub Desktop.
Save koingdev/c63a3b3ea5012e378cca16b69994c2d5 to your computer and use it in GitHub Desktop.
Swift Builder Pattern way to write AutoLayout code
/**
Builder Pattern way to write AutoLayout code
Example:
```swift
AutoLayoutBuilder(button)
.bottomTo(view.layoutMarginsGuide.bottomAnchor)
.centerXTo(view.centerXAnchor)
.width(value: button.width)
.height(value: button.height)
.build()
```
*/
struct AutoLayoutBuilder {
let view: UIView
init(_ view: UIView) {
self.view = view
}
@discardableResult
func topTo(_ anchor: NSLayoutYAxisAnchor, value: CGFloat = 0) -> AutoLayoutBuilder {
view.topAnchor.constraint(equalTo: anchor, constant: value).isActive = true
return self
}
@discardableResult
func bottomTo(_ anchor: NSLayoutYAxisAnchor, value: CGFloat = 0) -> AutoLayoutBuilder {
view.bottomAnchor.constraint(equalTo: anchor, constant: -value).isActive = true
return self
}
@discardableResult
func leadingTo(_ anchor: NSLayoutXAxisAnchor, value: CGFloat = 0) -> AutoLayoutBuilder {
view.leadingAnchor.constraint(equalTo: anchor, constant: value).isActive = true
return self
}
@discardableResult
func trailingTo(_ anchor: NSLayoutXAxisAnchor, value: CGFloat = 0) -> AutoLayoutBuilder {
view.trailingAnchor.constraint(equalTo: anchor, constant: -value).isActive = true
return self
}
@discardableResult
func centerXTo(_ anchor: NSLayoutXAxisAnchor, value: CGFloat = 0) -> AutoLayoutBuilder {
view.centerXAnchor.constraint(equalTo: anchor, constant: value).isActive = true
return self
}
@discardableResult
func centerYTo(_ anchor: NSLayoutYAxisAnchor, value: CGFloat = 0) -> AutoLayoutBuilder {
view.centerYAnchor.constraint(equalTo: anchor, constant: value).isActive = true
return self
}
@discardableResult
func centerInParent(_ view: UIView) -> AutoLayoutBuilder {
centerXTo(view.centerXAnchor)
centerYTo(view.centerYAnchor)
return self
}
@discardableResult
func width(value: CGFloat) -> AutoLayoutBuilder {
view.widthAnchor.constraint(equalToConstant: value).isActive = true
return self
}
@discardableResult
func height(value: CGFloat) -> AutoLayoutBuilder {
view.heightAnchor.constraint(equalToConstant: value).isActive = true
return self
}
func build() {
view.translatesAutoresizingMaskIntoConstraints = false
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment