GitHub上的代码👉,后续有时间会有更新。>>>GRLayout demo
-
使用
import UIKit
class ViewController: UIViewController {
override func viewDidLoad() {
super.viewDidLoad()
let testView = UIView()
testView.backgroundColor = .yellow
view.addSubview(testView)
testView.gr_top.equal(view.gr_top).offset(100.0)
testView.gr_left.equal(view.gr_left).offset(10.0)
testView.gr_right.equal(view.gr_right).offset(-10.0)
testView.gr_bottom.equal(view.gr_bottom).offset(-100)
// testView.gr_height.greaterThanOrEqual(200.0)
}
}
-
设计
第一反应想到的是给UIView做一个extension,让它及其子类都带有特定都属性,可以调用方法去设置,修改约束。
所以这里设计了几个属性,用于约束设置。
- gr_top
- gr_bottom
- gr_left
- gr_right
- gr_height
- gr_width
在UIView+Extension.swift 文件中,代码如下:
import UIKit
extension UIView {
var gr_top: GRLayoutY {
get {
translatesAutoresizingMaskIntoConstraints = false
return GRLayoutY.create(anchor: topAnchor)
}
}
var gr_bottom: GRLayoutY {
get {
translatesAutoresizingMaskIntoConstraints = false
return GRLayoutY.create(anchor: bottomAnchor)
}
}
var gr_left: GRLayoutX {
get {
translatesAutoresizingMaskIntoConstraints = false
return GRLayoutX.create(anchor: leftAnchor)
}
}
var gr_right: GRLayoutX {
get {
translatesAutoresizingMaskIntoConstraints = false
return GRLayoutX.create(anchor: rightAnchor)
}
}
var gr_height: GRLayoutDimension {
get {
translatesAutoresizingMaskIntoConstraints = false
return GRLayoutDimension.create(anchor: heightAnchor)
}
}
var gr_width: GRLayoutDimension {
get {
translatesAutoresizingMaskIntoConstraints = false
return GRLayoutDimension.create(anchor: widthAnchor)
}
}
}
-
添加方法实现,实现像Masonry链式编程的约束方法。(如果不明白什么是链式编程,可以看这里)
class GRLayoutY: NSObject {
open var constant: CGFloat = 0.0 {
didSet {
curLayoutConstraint.constant = constant
}
}
open var priority: Int = 1000 {
didSet {
curLayoutConstraint.priority = UILayoutPriority(rawValue: Float(priority))
}
}
private var curLayoutConstraint = NSLayoutConstraint()
private var curAnchor = NSLayoutYAxisAnchor()
open class func create(anchor: NSLayoutYAxisAnchor) -> GRLayoutY {
let grabin = GRLayoutY()
grabin.curAnchor = anchor
return grabin
}
@discardableResult open func equal(_ other: GRLayoutY) -> GRLayoutY {
curLayoutConstraint = curAnchor.constraint(equalTo: other.curAnchor)
curLayoutConstraint.isActive = true
return self
}
@discardableResult open func offset(_ offSet: CGFloat) -> GRLayoutY {
curLayoutConstraint.constant = offSet
return self
}
}
class GRLayoutX: NSObject {
open var constant: CGFloat = 0.0 {
didSet {
curLayoutConstraint.constant = constant
}
}
open var priority: Int = 1000 {
didSet {
curLayoutConstraint.priority = UILayoutPriority(rawValue: Float(priority))
}
}
private var curLayoutConstraint = NSLayoutConstraint()
private var curAnchor = NSLayoutXAxisAnchor()
open class func create(anchor: NSLayoutXAxisAnchor) -> GRLayoutX {
let grabin = GRLayoutX()
grabin.curAnchor = anchor
return grabin
}
@discardableResult open func equal(_ other: GRLayoutX) -> GRLayoutX {
curLayoutConstraint = curAnchor.constraint(equalTo: other.curAnchor)
curLayoutConstraint.isActive = true
return self
}
@discardableResult open func offset(_ offSet: CGFloat) -> GRLayoutX {
curLayoutConstraint.constant = offSet
return self
}
}
class GRLayoutDimension: NSObject {
open var constant: CGFloat = 0.0 {
didSet {
curLayoutConstraint.constant = constant
}
}
open var priority: Int = 1000 {
didSet {
curLayoutConstraint.priority = UILayoutPriority(rawValue: Float(priority))
}
}
private var curLayoutConstraint = NSLayoutConstraint()
private var curAnchor = NSLayoutDimension()
open class func create(anchor: NSLayoutDimension) -> GRLayoutDimension {
let grabin = GRLayoutDimension()
grabin.curAnchor = anchor
return grabin
}
@discardableResult open func equal(_ other: GRLayoutDimension, multiplier: CGFloat = 1) -> GRLayoutDimension {
curLayoutConstraint = curAnchor.constraint(equalTo: other.curAnchor, multiplier: multiplier)
curLayoutConstraint.isActive = true
return self
}
@discardableResult open func equal(_ equalToConstant: CGFloat) -> GRLayoutDimension {
curLayoutConstraint = curAnchor.constraint(equalToConstant: equalToConstant)
curLayoutConstraint.isActive = true
return self
}
@discardableResult open func greaterThanOrEqual(_ toConstant: CGFloat) -> GRLayoutDimension {
curLayoutConstraint = curAnchor.constraint(greaterThanOrEqualToConstant: toConstant)
curLayoutConstraint.isActive = true
return self
}
@discardableResult open func lessThanOrEqual(_ toConstant: CGFloat) -> GRLayoutDimension {
curLayoutConstraint = curAnchor.constraint(lessThanOrEqualToConstant: toConstant)
curLayoutConstraint.isActive = true
return self
}
@discardableResult open func offset(_ offSet: CGFloat) -> GRLayoutDimension {
curLayoutConstraint.constant = offSet
return self
}
}
-
Tips
让Xcode不报返回值使用警告,可以在带返回值的方法前加 @discardableResult