Created
May 24, 2018 08:42
-
-
Save harrytwright/f9101d7fae5b433d4fb01c6ed71ef779 to your computer and use it in GitHub Desktop.
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 | |
@objc extension UIView { | |
@nonobjc public func addConstraintsWithFormat(_ format: String, views: UIView...) { | |
var viewsDictionary = [String: UIView]() | |
for (index, view) in views.enumerated() { | |
let key = "v\(index)" | |
viewsDictionary[key] = view | |
view.translatesAutoresizingMaskIntoConstraints = false | |
} | |
addConstraints(NSLayoutConstraint.constraints(withVisualFormat: format, options: NSLayoutFormatOptions(), metrics: nil, views: viewsDictionary)) | |
} | |
@objc public func fillSuperview() { | |
translatesAutoresizingMaskIntoConstraints = false | |
if let superview = superview { | |
leftAnchor.constraint(equalTo: superview.leftAnchor).isActive = true | |
rightAnchor.constraint(equalTo: superview.rightAnchor).isActive = true | |
topAnchor.constraint(equalTo: superview.topAnchor).isActive = true | |
bottomAnchor.constraint(equalTo: superview.bottomAnchor).isActive = true | |
} | |
} | |
@objc public func anchor(to top: NSLayoutYAxisAnchor? = nil, left: NSLayoutXAxisAnchor? = nil, bottom: NSLayoutYAxisAnchor? = nil, right: NSLayoutXAxisAnchor? = nil, topConstant: CGFloat = 0, leftConstant: CGFloat = 0, bottomConstant: CGFloat = 0, rightConstant: CGFloat = 0, widthConstant: CGFloat = 0, heightConstant: CGFloat = 0) { | |
translatesAutoresizingMaskIntoConstraints = false | |
_ = anchorWithReturnAnchors(top, left: left, bottom: bottom, right: right, topConstant: topConstant, leftConstant: leftConstant, bottomConstant: bottomConstant, rightConstant: rightConstant, widthConstant: widthConstant, heightConstant: heightConstant) | |
} | |
@objc public func anchorWithReturnAnchors(_ top: NSLayoutYAxisAnchor? = nil, left: NSLayoutXAxisAnchor? = nil, bottom: NSLayoutYAxisAnchor? = nil, right: NSLayoutXAxisAnchor? = nil, topConstant: CGFloat = 0, leftConstant: CGFloat = 0, bottomConstant: CGFloat = 0, rightConstant: CGFloat = 0, widthConstant: CGFloat = 0, heightConstant: CGFloat = 0) -> [NSLayoutConstraint] { | |
translatesAutoresizingMaskIntoConstraints = false | |
var anchors = [NSLayoutConstraint]() | |
if let top = top { | |
anchors.append(topAnchor.constraint(equalTo: top, constant: topConstant)) | |
} | |
if let left = left { | |
anchors.append(leftAnchor.constraint(equalTo: left, constant: leftConstant)) | |
} | |
if let bottom = bottom { | |
anchors.append(bottomAnchor.constraint(equalTo: bottom, constant: -bottomConstant)) | |
} | |
if let right = right { | |
anchors.append(rightAnchor.constraint(equalTo: right, constant: -rightConstant)) | |
} | |
if widthConstant > 0 { | |
anchors.append(widthAnchor.constraint(equalToConstant: widthConstant)) | |
} | |
if heightConstant > 0 { | |
anchors.append(heightAnchor.constraint(equalToConstant: heightConstant)) | |
} | |
anchors.forEach({$0.isActive = true}) | |
return anchors | |
} | |
@objc public func anchorCenterXToSuperview(constant: CGFloat = 0) { | |
translatesAutoresizingMaskIntoConstraints = false | |
if let anchor = superview?.centerXAnchor { | |
centerXAnchor.constraint(equalTo: anchor, constant: constant).isActive = true | |
} | |
} | |
@objc public func anchorCenterYToSuperview(constant: CGFloat = 0) { | |
translatesAutoresizingMaskIntoConstraints = false | |
if let anchor = superview?.centerYAnchor { | |
centerYAnchor.constraint(equalTo: anchor, constant: constant).isActive = true | |
} | |
} | |
@objc public func anchorCenterSuperview() { | |
anchorCenterXToSuperview() | |
anchorCenterYToSuperview() | |
} | |
@nonobjc func add(_ views: UIView...) { | |
views.forEach { self.addSubview($0) } | |
} | |
} | |
extension UIView { | |
@objc var safeTopAnchor: NSLayoutYAxisAnchor { | |
if #available(iOS 11.0, *) { | |
return self.safeAreaLayoutGuide.topAnchor | |
} else { | |
return self.topAnchor | |
} | |
} | |
@objc var safeLeftAnchor: NSLayoutXAxisAnchor { | |
if #available(iOS 11.0, *){ | |
return self.safeAreaLayoutGuide.leftAnchor | |
}else { | |
return self.leftAnchor | |
} | |
} | |
@objc var safeRightAnchor: NSLayoutXAxisAnchor { | |
if #available(iOS 11.0, *){ | |
return self.safeAreaLayoutGuide.rightAnchor | |
}else { | |
return self.rightAnchor | |
} | |
} | |
@objc var safeBottomAnchor: NSLayoutYAxisAnchor { | |
if #available(iOS 11.0, *) { | |
return self.safeAreaLayoutGuide.bottomAnchor | |
} else { | |
return self.bottomAnchor | |
} | |
} | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment