|
//
// AutolayoutKit-Swift.swift
// PaiAi
//
// Created by mac on 16/7/21.
// Copyright © 2016年 FFIB. All rights reserved.
//
import UIKit
extension Array where Element : NSLayoutConstraint {
func autolayoutInstall() {
self.forEach {
$0.active()
}
}
func autolayoutUnInstall() {
self.forEach {
$0.active()
}
}
}
extension UIView {
@discardableResult
func useAutoLayout() -> Self {
translatesAutoresizingMaskIntoConstraints = false
return self
}
@discardableResult
func setLayoutHeight(_ height: CGFloat) -> Self {
NSLayoutConstraint(item: self as UIView, attribute: .height, relatedBy: .equal, toItem: nil, attribute: .notAnAttribute, multiplier: 1, constant: height).active()
return self
}
@discardableResult
func setLayoutWidth(_ width: CGFloat) -> Self {
NSLayoutConstraint(item: self as UIView, attribute: .width, relatedBy: .equal, toItem: nil, attribute: .notAnAttribute, multiplier: 1, constant: width).active()
return self
}
}
extension NSLayoutConstraint {
@discardableResult
func active(_ priority: UILayoutPriority = UILayoutPriority.required) -> Self {
// if self.priority != priority {
// self.priority = priority
// }
self.isActive = true
return self
}
func deActive() {
self.isActive = false
}
}
extension NSLayoutConstraint {
// MARK: - -size
static func equalSize(_ priority: UILayoutPriority = UILayoutPriority.required, views: UIView...) {
equalSize(priority, views : views)
}
static func equalSize(_ priority: UILayoutPriority = UILayoutPriority.required, views: [UIView]) {
equalHeight(priority, views: views)
equalWidth(priority, views: views)
}
//--
static func equalHeight(_ priority: UILayoutPriority = UILayoutPriority.required, views: UIView...) {
equalHeight(priority, views: views)
}
static func equalHeight(_ priority: UILayoutPriority = UILayoutPriority.required, views: [UIView]) {
guard views.count > 1 else {
return
}
var lastView = views[0]
views.forEach {
let current = $0
let c = NSLayoutConstraint(item: lastView, attribute: .height, relatedBy: .equal, toItem: current, attribute: .height, multiplier: 1, constant: 0)
c.priority = priority
c.active()
lastView = current
}
}
//--
static func equalWidth(_ priority: UILayoutPriority = UILayoutPriority.required, views: UIView...) {
equalWidth(priority, views: views)
}
static func equalWidth(_ priority: UILayoutPriority = UILayoutPriority.required, views: [UIView]) {
guard views.count > 1 else {
return
}
var lastView = views[0]
views.forEach {
let current = $0
let c = NSLayoutConstraint(item: lastView, attribute: .width, relatedBy: .equal, toItem: current, attribute: .width, multiplier: 1, constant: 0)
c.priority = priority
c.active()
lastView = current
}
}
@discardableResult
static func equalWidth(_ priority: UILayoutPriority = UILayoutPriority.required, firstView: UIView, secondView: UIView, delta: CGFloat = 0, multipler: CGFloat = 1) -> NSLayoutConstraint {
return NSLayoutConstraint(item: firstView, attribute: .width, relatedBy: .equal, toItem: secondView, attribute: .width, multiplier: multipler, constant: delta).active()
}
@discardableResult
static func equalHeight(_ priority: UILayoutPriority = UILayoutPriority.required, firstView: UIView, secondView: UIView, delta: CGFloat = 0, multipler: CGFloat = 1) -> NSLayoutConstraint {
return NSLayoutConstraint(item: firstView, attribute: .height, relatedBy: .equal, toItem: secondView, attribute: .height, multiplier: multipler, constant: delta).active()
}
// MARK: - -center
static func alignCenter(_ firstView: UIView, secondView: UIView) {
centerX(firstView, secondView: secondView)
centerY(firstView, secondView: secondView)
}
@discardableResult
static func centerX(_ firstView: UIView, secondView: UIView, constant: CGFloat = 0, multiplier: CGFloat = 1) -> NSLayoutConstraint {
return NSLayoutConstraint(item: firstView, attribute: .centerX, relatedBy: .equal, toItem: secondView, attribute: .centerX, multiplier: multiplier, constant: constant).active()
}
@discardableResult
static func centerY(_ firstView: UIView, secondView: UIView, constant: CGFloat = 0, multiplier: CGFloat = 1) -> NSLayoutConstraint {
return NSLayoutConstraint(item: firstView, attribute: .centerY, relatedBy: .equal, toItem: secondView, attribute: .centerY, multiplier: multiplier, constant: constant).active()
}
// MARK: - -space
@discardableResult
static func verticalSpace(_ firstView: UIView, secondView: UIView, space: CGFloat = 0) -> NSLayoutConstraint {
return NSLayoutConstraint(item: firstView, attribute: .bottom, relatedBy: .equal, toItem: secondView, attribute: .top, multiplier: 1, constant: space).active()
}
@discardableResult
static func horizontalSpace(_ firstView: UIView, secondView: UIView, space: CGFloat = 0) -> NSLayoutConstraint {
return NSLayoutConstraint(item: firstView, attribute: .trailing, relatedBy: .equal, toItem: secondView, attribute: .leading, multiplier: 1, constant: space).active()
}
// MARK: - -edge
@discardableResult
static func pinTop(_ firstView: UIView, secondView: UIView, space: CGFloat = 0, priority: UILayoutPriority = UILayoutPriority.required) -> NSLayoutConstraint {
return NSLayoutConstraint(item: firstView, attribute: .top, relatedBy: .equal, toItem: secondView, attribute: .top, multiplier: 1, constant: space).active()
}
@discardableResult
static func pinLeading(_ firstView: UIView, secondView: UIView, space: CGFloat = 0, priority: UILayoutPriority = UILayoutPriority.required) -> NSLayoutConstraint {
return NSLayoutConstraint(item: firstView, attribute: .leading, relatedBy: .equal, toItem: secondView, attribute: .leading, multiplier: 1, constant: space).active()
}
@discardableResult
static func pinBottom(_ firstView: UIView, secondView: UIView, space: CGFloat = 0, priority: UILayoutPriority = UILayoutPriority.required) -> NSLayoutConstraint {
return NSLayoutConstraint(item: firstView, attribute: .bottom, relatedBy: .equal, toItem: secondView, attribute: .bottom, multiplier: 1, constant: space).active()
}
@discardableResult
static func pinTrailing(_ firstView: UIView, secondView: UIView, space: CGFloat = 0, priority: UILayoutPriority = UILayoutPriority.required) -> NSLayoutConstraint {
return NSLayoutConstraint(item: firstView, attribute: .trailing, relatedBy: .equal, toItem: secondView, attribute: .trailing, multiplier: 1, constant: space).active()
}
}
|