Skip to content

Instantly share code, notes, and snippets.

@all12jus
Last active April 11, 2020 10:56
Show Gist options
  • Save all12jus/9d301f442bbff0712911d8cfaa3372d4 to your computer and use it in GitHub Desktop.
Save all12jus/9d301f442bbff0712911d8cfaa3372d4 to your computer and use it in GitHub Desktop.
//
// ConstraintUtils.swift
//
// Created by Justin Allen on 8/15/19.
// Updated on 1/30/20
// Copyright © 2019 Justin Allen. All rights reserved.
//
import UIKit
class Utils {
public struct Contraints {
var child: UIView? = nil
var parent: UILayoutGuide? = nil
var topAnchor : NSLayoutConstraint? = nil
var leadingAnchor : NSLayoutConstraint? = nil
var trailingAnchor : NSLayoutConstraint? = nil
var bottomAnchor : NSLayoutConstraint? = nil
var widthAnchor : NSLayoutConstraint? = nil
var heightAnchor : NSLayoutConstraint? = nil
var centerXAnchor: NSLayoutConstraint? = nil
var centerYAnchor: NSLayoutConstraint? = nil
}
public static func SetupContraints(
child : UIView, parent: UIView, addToParent: Bool = true,
top: Bool = true, topConstant: CGFloat? = nil, topTarget: NSLayoutAnchor<NSLayoutYAxisAnchor>? = nil,
leading:Bool = true, leadingConstant: CGFloat? = nil, leadingTarget: NSLayoutAnchor<NSLayoutXAxisAnchor>? = nil,
trailing:Bool = true, trailingConstant: CGFloat? = nil, trailingTarget: NSLayoutAnchor<NSLayoutXAxisAnchor>? = nil,
bottom:Bool = true, bottomConstant: CGFloat? = nil, bottomTarget: NSLayoutAnchor<NSLayoutYAxisAnchor>? = nil,
centerX:Bool = false, centerXConstant: CGFloat? = nil, centerXTarget: NSLayoutAnchor<NSLayoutXAxisAnchor>? = nil,
centerY:Bool = false, centerYConstant: CGFloat? = nil, centerYTarget: NSLayoutAnchor<NSLayoutYAxisAnchor>? = nil,
width: Bool = false, widthConstant: CGFloat? = nil,
height: Bool = false, heightConstant: CGFloat? = nil
) -> Contraints {
child.translatesAutoresizingMaskIntoConstraints = false
parent.addSubview(child)
let guide : UILayoutGuide = parent.safeAreaLayoutGuide
var constraints : Contraints = Contraints()
constraints.child = child
constraints.parent = guide
if top {
let target = topTarget ?? guide.topAnchor
if let constant = topConstant {
constraints.topAnchor = child.topAnchor.constraint(equalTo: target, constant: constant)
} else {
constraints.topAnchor = child.topAnchor.constraint(equalTo: target)
}
constraints.topAnchor?.isActive = true
}
if leading {
let target = leadingTarget ?? guide.leadingAnchor
if let constant = leadingConstant {
constraints.leadingAnchor = child.leadingAnchor.constraint(equalTo: target, constant: constant)
} else {
constraints.leadingAnchor = child.leadingAnchor.constraint(equalTo: target)
}
constraints.leadingAnchor?.isActive = true
}
if trailing {
let target = trailingTarget ?? guide.trailingAnchor
if let constant = trailingConstant {
constraints.trailingAnchor = child.trailingAnchor.constraint(equalTo: target, constant: -1 * constant)
} else {
constraints.trailingAnchor = child.trailingAnchor.constraint(equalTo: target)
}
constraints.trailingAnchor?.isActive = true
}
if bottom {
let target = bottomTarget ?? guide.bottomAnchor
if let constant = bottomConstant {
constraints.bottomAnchor = child.bottomAnchor.constraint(equalTo: target, constant: -1 * constant)
} else {
constraints.bottomAnchor = child.bottomAnchor.constraint(equalTo: target)
}
constraints.bottomAnchor?.isActive = true
}
if centerX {
let target = centerXTarget ?? guide.centerXAnchor
if let constant = centerXConstant {
constraints.centerXAnchor = child.centerXAnchor.constraint(equalTo: target, constant: constant)
} else {
constraints.centerXAnchor = child.centerXAnchor.constraint(equalTo: target)
}
constraints.centerXAnchor?.isActive = true
}
if centerY {
let target = centerYTarget ?? guide.centerYAnchor
if let constant = centerYConstant {
constraints.centerYAnchor = child.centerYAnchor.constraint(equalTo: target, constant: constant)
} else {
constraints.centerYAnchor = child.centerYAnchor.constraint(equalTo: target)
}
constraints.centerYAnchor?.isActive = true
}
if width {
if let constant = widthConstant {
constraints.widthAnchor = child.widthAnchor.constraint(equalToConstant: constant)
} else {
print("widthConstant isn't set while width is enabled")
}
constraints.widthAnchor?.isActive = true
}
if height {
if let constant = heightConstant {
constraints.heightAnchor = child.heightAnchor.constraint(equalToConstant: constant)
} else {
print("heightConstant isn't set while height is enabled")
}
constraints.heightAnchor?.isActive = true
}
return constraints
}
}
extension UIView {
func pinToParent(parent: UIView, constant: CGFloat = 0) {
self.translatesAutoresizingMaskIntoConstraints = false
parent.addSubview(self)
_ = self.topAnchor.constraint(equalTo: parent.topAnchor, constant: constant).isActive = true
_ = self.bottomAnchor.constraint(equalTo: parent.bottomAnchor, constant: -constant).isActive = true
_ = self.leadingAnchor.constraint(equalTo: parent.leadingAnchor, constant: constant).isActive = true
_ = self.trailingAnchor.constraint(equalTo: parent.trailingAnchor, constant: -constant).isActive = true
}
func centerToParent(parent: UIView) {
self.translatesAutoresizingMaskIntoConstraints = false
parent.addSubview(self)
_ = self.centerXAnchor.constraint(equalTo: parent.centerXAnchor).isActive = true
_ = self.centerYAnchor.constraint(equalTo: parent.centerYAnchor).isActive = true
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment