123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354 |
- import UIKit
- public extension UIView {
- func makeBorder(color: UIColor = UIColor.red) {
- self.layer.borderColor = color.cgColor
- self.layer.borderWidth = 2
- }
- func alignLeadingToAnchor(_ anchor: NSLayoutXAxisAnchor, paddingLeading: CGFloat = 0.0, priority: UILayoutPriority? = .none) {
- let constraint = self.leadingAnchor.constraint(equalTo: anchor, constant: paddingLeading)
- if let priority = priority {
- constraint.priority = priority
- }
- constraint.isActive = true
- }
- func alignTrailingToAnchor(_ anchor: NSLayoutXAxisAnchor, paddingTrailing: CGFloat = 0.0, priority: UILayoutPriority? = .none) {
- let constraint = self.trailingAnchor.constraint(equalTo: anchor, constant: -paddingTrailing)
- if let priority = priority {
- constraint.priority = priority
- }
- constraint.isActive = true
- }
- func alignTopToAnchor(_ anchor: NSLayoutYAxisAnchor, paddingTop: CGFloat = 0.0, priority: UILayoutPriority? = .none) {
- let constraint = self.topAnchor.constraint(equalTo: anchor, constant: paddingTop)
- if let priority = priority {
- constraint.priority = priority
- }
- constraint.isActive = true
- }
- func alignBottomToAnchor(_ anchor: NSLayoutYAxisAnchor, paddingBottom: CGFloat = 0.0, priority: UILayoutPriority? = .none) {
- let constraint = self.bottomAnchor.constraint(equalTo: anchor, constant: -paddingBottom)
- if let priority = priority {
- constraint.priority = priority
- }
- constraint.isActive = true
- }
- func fill(view: UIView, paddingLeading: CGFloat? = 0.0, paddingTrailing: CGFloat? = 0.0, paddingTop: CGFloat? = 0.0, paddingBottom: CGFloat? = 0.0) {
- alignLeadingToAnchor(view.leadingAnchor, paddingLeading: paddingLeading ?? 0.0)
- alignTrailingToAnchor(view.trailingAnchor, paddingTrailing: paddingTrailing ?? 0.0)
- alignTopToAnchor(view.topAnchor, paddingTop: paddingTop ?? 0.0)
- alignBottomToAnchor(view.bottomAnchor, paddingBottom: paddingBottom ?? 0.0)
- }
- func constraintAlignTopTo(_ view: UIView) -> NSLayoutConstraint {
- return constraintAlignTopTo(view, paddingTop: 0.0)
- }
- func constraintAlignTopTo(_ view: UIView, paddingTop: CGFloat = 0.0, priority: UILayoutPriority? = .none) -> NSLayoutConstraint {
- let constraint = NSLayoutConstraint(
- item: self,
- attribute: .top,
- relatedBy: .equal,
- toItem: view,
- attribute: .top,
- multiplier: 1.0,
- constant: paddingTop)
- if let priority = priority {
- constraint.priority = priority
- }
- return constraint
- }
-
- /**
- ensure the top of self is aligned with or lower than another view
- can be used in conjunction with constraintAlignCenterY
- */
- func constraintAlignTopMaxTo(_ view: UIView, paddingTop: CGFloat = 0.0, priority: UILayoutPriority? = .none) -> NSLayoutConstraint {
- let constraint = NSLayoutConstraint(
- item: self,
- attribute: .top,
- relatedBy: .greaterThanOrEqual,
- toItem: view,
- attribute: .top,
- multiplier: 1.0,
- constant: paddingTop)
- if let priority = priority {
- constraint.priority = priority
- }
- return constraint
- }
- func constraintAlignBottomTo(_ view: UIView, paddingBottom: CGFloat = 0.0, priority: UILayoutPriority? = .none) -> NSLayoutConstraint {
- let constraint = NSLayoutConstraint(
- item: self,
- attribute: .bottom,
- relatedBy: .equal,
- toItem: view,
- attribute: .bottom,
- multiplier: 1.0,
- constant: -paddingBottom)
- if let priority = priority {
- constraint.priority = priority
- }
- return constraint
- }
- func constraintAlignLeadingTo(_ view: UIView, paddingLeading: CGFloat = 0.0, priority: UILayoutPriority? = .none) -> NSLayoutConstraint {
- let constraint = NSLayoutConstraint(
- item: self,
- attribute: .leading,
- relatedBy: .equal,
- toItem: view,
- attribute: .leading,
- multiplier: 1.0,
- constant: paddingLeading)
- if let priority = priority {
- constraint.priority = priority
- }
- return constraint
- }
- /**
- allows to align leading to the leading of another view but allows left side shrinking
- */
- func constraintAlignLeadingMaxTo(_ view: UIView, paddingLeading: CGFloat = 0.0, priority: UILayoutPriority? = .none) -> NSLayoutConstraint {
- let constraint = NSLayoutConstraint(
- item: self,
- attribute: .leading,
- relatedBy: .greaterThanOrEqual,
- toItem: view,
- attribute: .leading,
- multiplier: 1.0,
- constant: paddingLeading)
- if let priority = priority {
- constraint.priority = priority
- }
- return constraint
- }
- func constraintAlignTrailingTo(_ view: UIView, paddingTrailing: CGFloat = 0.0, priority: UILayoutPriority? = .none) -> NSLayoutConstraint {
- let constraint = NSLayoutConstraint(
- item: self,
- attribute: .trailing,
- relatedBy: .equal,
- toItem: view,
- attribute: .trailing,
- multiplier: 1.0,
- constant: -paddingTrailing)
- if let priority = priority {
- constraint.priority = priority
- }
- return constraint
- }
- /**
- allows to align trailing to the trailing of another view but allows right side shrinking
- */
- func constraintAlignTrailingMaxTo(_ view: UIView, paddingTrailing: CGFloat = 0.0, priority: UILayoutPriority? = .none) -> NSLayoutConstraint {
- let constraint = NSLayoutConstraint(
- item: self,
- attribute: .trailing,
- relatedBy: .lessThanOrEqual,
- toItem: view,
- attribute: .trailing,
- multiplier: 1.0,
- constant: -paddingTrailing)
- if let priority = priority {
- constraint.priority = priority
- }
- return constraint
- }
- func constraintToBottomOf(_ view: UIView, paddingTop: CGFloat = 0.0, priority: UILayoutPriority? = .none) -> NSLayoutConstraint {
- let constraint = NSLayoutConstraint(
- item: self,
- attribute: .top,
- relatedBy: .equal,
- toItem: view,
- attribute: .bottom,
- multiplier: 1.0,
- constant: paddingTop)
- if let priority = priority {
- constraint.priority = priority
- }
- return constraint
- }
- func constraintToTrailingOf(_ view: UIView, paddingLeading: CGFloat = 0.0, priority: UILayoutPriority? = .none) -> NSLayoutConstraint {
- let constraint = NSLayoutConstraint(
- item: self,
- attribute: .leading,
- relatedBy: .equal,
- toItem: view,
- attribute: .trailing,
- multiplier: 1.0,
- constant: paddingLeading)
- if let priority = priority {
- constraint.priority = priority
- }
- return constraint
- }
- func constraintTrailingToLeadingOf(_ view: UIView, paddingTrailing: CGFloat = 0.0, priority: UILayoutPriority? = .none) -> NSLayoutConstraint {
- let constraint = NSLayoutConstraint(
- item: self,
- attribute: .trailing,
- relatedBy: .equal,
- toItem: view,
- attribute: .leading,
- multiplier: 1.0,
- constant: -paddingTrailing)
- if let priority = priority {
- constraint.priority = priority
- }
- return constraint
- }
- func constraintCenterXTo(_ view: UIView, paddingX: CGFloat = 0.0, priority: UILayoutPriority? = .none) -> NSLayoutConstraint {
- let constraint = NSLayoutConstraint(item: self,
- attribute: .centerX,
- relatedBy: .equal,
- toItem: view,
- attribute: .centerX,
- multiplier: 1.0,
- constant: paddingX)
- if let priority = priority {
- constraint.priority = priority
- }
- return constraint
- }
- func constraintCenterYTo(_ view: UIView, paddingY: CGFloat = 0.0, priority: UILayoutPriority? = .none) -> NSLayoutConstraint {
- let constraint = NSLayoutConstraint(item: self,
- attribute: .centerY,
- relatedBy: .equal,
- toItem: view,
- attribute: .centerY,
- multiplier: 1.0,
- constant: paddingY)
- if let priority = priority {
- constraint.priority = priority
- }
- return constraint
- }
- func constraintHeightTo(_ height: CGFloat, priority: UILayoutPriority? = .none) -> NSLayoutConstraint {
- let constraint = heightAnchor.constraint(equalToConstant: height)
- if let priority = priority {
- constraint.priority = priority
- }
- return constraint
- }
- func constraintWidthTo(_ width: CGFloat, priority: UILayoutPriority? = .none) -> NSLayoutConstraint {
- let constraint = widthAnchor.constraint(equalToConstant: width)
- if let priority = priority {
- constraint.priority = priority
- }
- return constraint
- }
- func fillSuperview() {
- guard let superview = self.superview else {
- return
- }
- translatesAutoresizingMaskIntoConstraints = false
- let constraints: [NSLayoutConstraint] = [
- leftAnchor.constraint(equalTo: superview.leftAnchor),
- rightAnchor.constraint(equalTo: superview.rightAnchor),
- topAnchor.constraint(equalTo: superview.topAnchor),
- bottomAnchor.constraint(equalTo: superview.bottomAnchor)]
- NSLayoutConstraint.activate(constraints)
- }
- func centerInSuperview() {
- guard let superview = self.superview else {
- return
- }
- translatesAutoresizingMaskIntoConstraints = false
- let constraints: [NSLayoutConstraint] = [
- centerXAnchor.constraint(equalTo: superview.centerXAnchor),
- centerYAnchor.constraint(equalTo: superview.centerYAnchor)
- ]
- NSLayoutConstraint.activate(constraints)
- }
- func constraint(equalTo size: CGSize) {
- guard superview != nil else { return }
- translatesAutoresizingMaskIntoConstraints = false
- let constraints: [NSLayoutConstraint] = [
- widthAnchor.constraint(equalToConstant: size.width),
- heightAnchor.constraint(equalToConstant: size.height)
- ]
- NSLayoutConstraint.activate(constraints)
- }
- @discardableResult
- func addConstraints(_ top: NSLayoutYAxisAnchor? = nil, left: NSLayoutXAxisAnchor? = nil, bottom: NSLayoutYAxisAnchor? = nil, right: NSLayoutXAxisAnchor? = nil, centerY: NSLayoutYAxisAnchor? = nil, centerX: NSLayoutXAxisAnchor? = nil, topConstant: CGFloat = 0, leftConstant: CGFloat = 0, bottomConstant: CGFloat = 0, rightConstant: CGFloat = 0, centerYConstant: CGFloat = 0, centerXConstant: CGFloat = 0, widthConstant: CGFloat = 0, heightConstant: CGFloat = 0) -> [NSLayoutConstraint] {
- if self.superview == nil {
- return []
- }
- translatesAutoresizingMaskIntoConstraints = false
- var constraints = [NSLayoutConstraint]()
- if let top = top {
- let constraint = topAnchor.constraint(equalTo: top, constant: topConstant)
- constraint.identifier = "top"
- constraints.append(constraint)
- }
- if let left = left {
- let constraint = leftAnchor.constraint(equalTo: left, constant: leftConstant)
- constraint.identifier = "left"
- constraints.append(constraint)
- }
- if let bottom = bottom {
- let constraint = bottomAnchor.constraint(equalTo: bottom, constant: -bottomConstant)
- constraint.identifier = "bottom"
- constraints.append(constraint)
- }
- if let right = right {
- let constraint = rightAnchor.constraint(equalTo: right, constant: -rightConstant)
- constraint.identifier = "right"
- constraints.append(constraint)
- }
- if let centerY = centerY {
- let constraint = centerYAnchor.constraint(equalTo: centerY, constant: centerYConstant)
- constraint.identifier = "centerY"
- constraints.append(constraint)
- }
- if let centerX = centerX {
- let constraint = centerXAnchor.constraint(equalTo: centerX, constant: centerXConstant)
- constraint.identifier = "centerX"
- constraints.append(constraint)
- }
- if widthConstant > 0 {
- let constraint = widthAnchor.constraint(equalToConstant: widthConstant)
- constraint.identifier = "width"
- constraints.append(constraint)
- }
- if heightConstant > 0 {
- let constraint = heightAnchor.constraint(equalToConstant: heightConstant)
- constraint.identifier = "height"
- constraints.append(constraint)
- }
- NSLayoutConstraint.activate(constraints)
- return constraints
- }
- }
|