Created
December 13, 2020 15:57
-
-
Save imjhk03/926614e1734477bac428d1fdea4ab599 to your computer and use it in GitHub Desktop.
Layout(anchor) views easily extending from UIView
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
| import UIKit | |
| struct AnchoredConstraints { | |
| var top, leading, bottom, trailing, width, height: NSLayoutConstraint? | |
| } | |
| extension UIView { | |
| @discardableResult | |
| func anchor(top: NSLayoutYAxisAnchor?, leading: NSLayoutXAxisAnchor?, bottom: NSLayoutYAxisAnchor?, trailing: NSLayoutXAxisAnchor?, padding: UIEdgeInsets = .zero, size: CGSize = .zero) -> AnchoredConstraints { | |
| translatesAutoresizingMaskIntoConstraints = false | |
| var anchoredConstraints = AnchoredConstraints() | |
| if let top = top { | |
| anchoredConstraints.top = topAnchor.constraint(equalTo: top, constant: padding.top) | |
| } | |
| if let leading = leading { | |
| anchoredConstraints.leading = leadingAnchor.constraint(equalTo: leading, constant: padding.left) | |
| } | |
| if let bottom = bottom { | |
| anchoredConstraints.bottom = bottomAnchor.constraint(equalTo: bottom, constant: -padding.bottom) | |
| } | |
| if let trailing = trailing { | |
| anchoredConstraints.trailing = trailingAnchor.constraint(equalTo: trailing, constant: -padding.right) | |
| } | |
| if size.width != 0 { | |
| anchoredConstraints.width = widthAnchor.constraint(equalToConstant: size.width) | |
| } | |
| if size.height != 0 { | |
| anchoredConstraints.height = heightAnchor.constraint(equalToConstant: size.height) | |
| } | |
| [anchoredConstraints.top, anchoredConstraints.leading, anchoredConstraints.bottom, anchoredConstraints.trailing, anchoredConstraints.width, anchoredConstraints.height].forEach{ $0?.isActive = true } | |
| return anchoredConstraints | |
| } | |
| func anchor(size: CGSize) { | |
| if size.width != 0 { | |
| widthAnchor.constraint(equalToConstant: size.width).isActive = true | |
| } | |
| if size.height != 0 { | |
| heightAnchor.constraint(equalToConstant: size.height).isActive = true | |
| } | |
| } | |
| func anchorFillToSuperViewSafeArea(padding: UIEdgeInsets = .zero) { | |
| if #available(iOS 11.0, *) { | |
| anchor(top: superview?.safeAreaLayoutGuide.topAnchor, leading: superview?.safeAreaLayoutGuide.leadingAnchor, bottom: superview?.safeAreaLayoutGuide.bottomAnchor, trailing: superview?.safeAreaLayoutGuide.trailingAnchor, padding: padding) | |
| } else { | |
| anchor(top: superview?.topAnchor, leading: superview?.leadingAnchor, bottom: superview?.bottomAnchor, trailing: superview?.trailingAnchor, padding: padding) | |
| } | |
| } | |
| func anchorFillToSuperView(padding: UIEdgeInsets = .zero) { | |
| anchor(top: superview?.topAnchor, leading: superview?.leadingAnchor, bottom: superview?.bottomAnchor, trailing: superview?.trailingAnchor, padding: padding) | |
| } | |
| // Need to clean | |
| func fillSuperview() { | |
| anchor(top: superview?.topAnchor, leading: superview?.leadingAnchor, bottom: superview?.bottomAnchor, trailing: superview?.trailingAnchor) | |
| } | |
| func anchorSize(to view: UIView) { | |
| widthAnchor.constraint(equalTo: view.widthAnchor).isActive = true | |
| heightAnchor.constraint(equalTo: view.heightAnchor).isActive = true | |
| } | |
| } |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment