Skip to content

Commit

Permalink
Merge pull request #10 from gearmamn06/develop
Browse files Browse the repository at this point in the history
Develop
  • Loading branch information
sudopark committed Nov 30, 2019
2 parents d56629f + 970ddfc commit 35068d8
Show file tree
Hide file tree
Showing 13 changed files with 522 additions and 13 deletions.
2 changes: 1 addition & 1 deletion CoolLayout.podspec
Original file line number Diff line number Diff line change
Expand Up @@ -8,7 +8,7 @@

Pod::Spec.new do |s|
s.name = 'CoolLayout'
s.version = '1.0.3'
s.version = '1.1.0'
s.summary = 'Easy and simple way to build a view only codes'

# This description is used to generate tags and improve search results.
Expand Down
194 changes: 194 additions & 0 deletions CoolLayout/Classes/NSLayoutAnchor+Extension.swift
Original file line number Diff line number Diff line change
@@ -0,0 +1,194 @@
//
// NSLayoutAnchor+Extension.swift
// CoolLayout
//
// Created by Sudo.park on 2019/11/30.
//

import UIKit


fileprivate extension NSLayoutConstraint {

private var shouldActive: Bool {
if let firstView = self.firstItem as? UIView {
return firstView.shouldActiveWhenConstraintMade
}
return false
}

func activeOrNot() -> NSLayoutConstraint {
if shouldActive {
self.isActive = true
}
return self
}
}


// MARK: - Equal operation
extension NSLayoutXAxisAnchor {

@discardableResult
public func equal(_ otherAnchor: NSLayoutXAxisAnchor) -> NSLayoutConstraint {
return self.constraint(equalTo: otherAnchor)
.activeOrNot()
}

@discardableResult
public func equal(_ half: HalfNSLayoutConstraint<NSLayoutXAxisAnchor>) -> NSLayoutConstraint {
return self.constraint(equalTo: half.referenceAnchor, constant: half.constant)
.activeOrNot()
}
}

extension NSLayoutYAxisAnchor {

@discardableResult
public func equal(_ otherAnchor: NSLayoutYAxisAnchor) -> NSLayoutConstraint {
return self.constraint(equalTo: otherAnchor)
.activeOrNot()
}

@discardableResult
public func equal(_ half: HalfNSLayoutConstraint<NSLayoutYAxisAnchor>) -> NSLayoutConstraint {
return self.constraint(equalTo: half.referenceAnchor, constant: half.constant)
.activeOrNot()
}
}

extension NSLayoutDimension {

@discardableResult
public func equal(_ constant: CGFloat) -> NSLayoutConstraint {
return self.constraint(equalToConstant: constant)
.activeOrNot()
}

@discardableResult
public func equal(_ otherAnchor: NSLayoutDimension) -> NSLayoutConstraint {
return self.constraint(equalTo: otherAnchor)
.activeOrNot()
}

@discardableResult
public func equal(_ half: HalfNSLayoutConstraint<NSLayoutDimension>) -> NSLayoutConstraint {
guard let layoutDimension = half.referenceAnchor as? NSLayoutDimension else {
fatalError()
}
return self.constraint(equalTo: layoutDimension, multiplier: half.multiplier, constant: half.constant)
.activeOrNot()
}
}

// MARK: - greaterThan operation
extension NSLayoutXAxisAnchor {

@discardableResult
public func greaterThan(orEqual otherAnchor: NSLayoutXAxisAnchor) -> NSLayoutConstraint {
return self.constraint(greaterThanOrEqualTo: otherAnchor)
.activeOrNot()
}

@discardableResult
public func greaterThan(orEqual half: HalfNSLayoutConstraint<NSLayoutXAxisAnchor>) -> NSLayoutConstraint {
return self.constraint(greaterThanOrEqualTo: half.referenceAnchor, constant: half.constant)
.activeOrNot()
}
}

extension NSLayoutYAxisAnchor {

@discardableResult
public func greaterThan(orEqual otherAnchor: NSLayoutYAxisAnchor) -> NSLayoutConstraint {
return self.constraint(greaterThanOrEqualTo: otherAnchor)
.activeOrNot()
}

@discardableResult
public func greaterThan(orEqual half: HalfNSLayoutConstraint<NSLayoutYAxisAnchor>) -> NSLayoutConstraint {
return self.constraint(greaterThanOrEqualTo: half.referenceAnchor, constant: half.constant)
.activeOrNot()
}
}

extension NSLayoutDimension {

@discardableResult
public func greaterThan(orEqual constant: CGFloat) -> NSLayoutConstraint {
return self.constraint(greaterThanOrEqualToConstant: constant)
.activeOrNot()
}

@discardableResult
public func greaterThan(orEqual otherAnchor: NSLayoutDimension) -> NSLayoutConstraint {
return self.constraint(greaterThanOrEqualTo: otherAnchor)
.activeOrNot()
}

@discardableResult
public func greaterThan(orEqual half: HalfNSLayoutConstraint<NSLayoutDimension>) -> NSLayoutConstraint {
guard let layoutDimension = half.referenceAnchor as? NSLayoutDimension else {
fatalError()
}
return self.constraint(greaterThanOrEqualTo: layoutDimension,
multiplier: half.multiplier, constant: half.constant)
.activeOrNot()
}
}

// MARK: - lessThan operation
extension NSLayoutXAxisAnchor {

@discardableResult
public func lessThan(orEqual otherAnchor: NSLayoutXAxisAnchor) -> NSLayoutConstraint {
return self.constraint(lessThanOrEqualTo: otherAnchor)
.activeOrNot()
}

@discardableResult
public func lessThan(orEqual half: HalfNSLayoutConstraint<NSLayoutXAxisAnchor>) -> NSLayoutConstraint {
return self.constraint(lessThanOrEqualTo: half.referenceAnchor, constant: half.constant)
.activeOrNot()
}
}

extension NSLayoutYAxisAnchor {

@discardableResult
public func lessThan(orEqual otherAnchor: NSLayoutYAxisAnchor) -> NSLayoutConstraint {
return self.constraint(lessThanOrEqualTo: otherAnchor)
.activeOrNot()
}

@discardableResult
public func lessThan(orEqual half: HalfNSLayoutConstraint<NSLayoutYAxisAnchor>) -> NSLayoutConstraint {
return self.constraint(lessThanOrEqualTo: half.referenceAnchor, constant: half.constant)
.activeOrNot()
}
}

extension NSLayoutDimension {

@discardableResult
public func lessThan(orEqual constant: CGFloat) -> NSLayoutConstraint {
return self.constraint(lessThanOrEqualToConstant: constant)
.activeOrNot()
}

@discardableResult
public func lessThan(orEqual otherAnchor: NSLayoutDimension) -> NSLayoutConstraint {
return self.constraint(lessThanOrEqualTo: otherAnchor)
.activeOrNot()
}

@discardableResult
public func lessThan(orEqual half: HalfNSLayoutConstraint<NSLayoutDimension>) -> NSLayoutConstraint {
guard let layoutDimension = half.referenceAnchor as? NSLayoutDimension else {
fatalError()
}
return self.constraint(lessThanOrEqualTo: layoutDimension,
multiplier: half.multiplier, constant: half.constant)
.activeOrNot()
}
}
2 changes: 0 additions & 2 deletions CoolLayout/Classes/NSLayoutConstraint+Extension.swift
Original file line number Diff line number Diff line change
Expand Up @@ -57,6 +57,4 @@ public extension NSLayoutConstraint {

return newConstraint
}

}

11 changes: 10 additions & 1 deletion CoolLayout/Classes/NSLayoutConstraintFormula.swift
Original file line number Diff line number Diff line change
Expand Up @@ -125,7 +125,6 @@ public func == (_ target: NSLayoutDimension, _ constant: CGFloat) -> NSLayoutCon
}



// MARK: - Less than ro Equal

@discardableResult
Expand Down Expand Up @@ -203,3 +202,13 @@ public func >= (_ target: NSLayoutDimension,
.activeOrNot()
}


// MARK: set priority

extension NSLayoutConstraint {
@discardableResult
public func priority(value: Float) -> NSLayoutConstraint {
self.priority = UILayoutPriority(rawValue: value)
return self
}
}
4 changes: 4 additions & 0 deletions Example/CoolLayout.xcodeproj/project.pbxproj
Original file line number Diff line number Diff line change
Expand Up @@ -14,6 +14,7 @@
607FACDB1AFB9204008FA782 /* Main.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 607FACD91AFB9204008FA782 /* Main.storyboard */; };
607FACDD1AFB9204008FA782 /* Images.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 607FACDC1AFB9204008FA782 /* Images.xcassets */; };
607FACEC1AFB9204008FA782 /* NSLayoutConstraintFormulaTest.swift in Sources */ = {isa = PBXBuildFile; fileRef = 607FACEB1AFB9204008FA782 /* NSLayoutConstraintFormulaTest.swift */; };
9B8CA07B2392694600C4628D /* CircleViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9B8CA07A2392694600C4628D /* CircleViewController.swift */; };
C2692565235B388C002FA329 /* StackEmbedViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = C2692564235B388C002FA329 /* StackEmbedViewController.swift */; };
C269256B235B7565002FA329 /* TableEmbedViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = C269256A235B7565002FA329 /* TableEmbedViewController.swift */; };
C269256D235B75B3002FA329 /* Deco.swift in Sources */ = {isa = PBXBuildFile; fileRef = C269256C235B75B3002FA329 /* Deco.swift */; };
Expand Down Expand Up @@ -48,6 +49,7 @@
607FACEB1AFB9204008FA782 /* NSLayoutConstraintFormulaTest.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = NSLayoutConstraintFormulaTest.swift; sourceTree = "<group>"; };
748A55CC5C1078C652D99422 /* README.md */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = net.daringfireball.markdown; name = README.md; path = ../README.md; sourceTree = "<group>"; };
950B6372A3C8FC423BED9004 /* CoolLayout.podspec */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text; name = CoolLayout.podspec; path = ../CoolLayout.podspec; sourceTree = "<group>"; xcLanguageSpecificationIdentifier = xcode.lang.ruby; };
9B8CA07A2392694600C4628D /* CircleViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = CircleViewController.swift; sourceTree = "<group>"; };
BC29543652C1D539D016C224 /* Pods_CoolLayout_Tests.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Pods_CoolLayout_Tests.framework; sourceTree = BUILT_PRODUCTS_DIR; };
C2692564235B388C002FA329 /* StackEmbedViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = StackEmbedViewController.swift; sourceTree = "<group>"; };
C269256A235B7565002FA329 /* TableEmbedViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = TableEmbedViewController.swift; sourceTree = "<group>"; };
Expand Down Expand Up @@ -106,6 +108,7 @@
607FACD71AFB9204008FA782 /* BaseViewController.swift */,
C2692564235B388C002FA329 /* StackEmbedViewController.swift */,
C269256A235B7565002FA329 /* TableEmbedViewController.swift */,
9B8CA07A2392694600C4628D /* CircleViewController.swift */,
607FACD91AFB9204008FA782 /* Main.storyboard */,
607FACDC1AFB9204008FA782 /* Images.xcassets */,
607FACD31AFB9204008FA782 /* Supporting Files */,
Expand Down Expand Up @@ -343,6 +346,7 @@
files = (
C2692565235B388C002FA329 /* StackEmbedViewController.swift in Sources */,
C269256B235B7565002FA329 /* TableEmbedViewController.swift in Sources */,
9B8CA07B2392694600C4628D /* CircleViewController.swift in Sources */,
C269256D235B75B3002FA329 /* Deco.swift in Sources */,
607FACD81AFB9204008FA782 /* BaseViewController.swift in Sources */,
607FACD61AFB9204008FA782 /* AppDelegate.swift in Sources */,
Expand Down
25 changes: 23 additions & 2 deletions Example/CoolLayout/BaseViewController.swift
Original file line number Diff line number Diff line change
Expand Up @@ -17,7 +17,7 @@ class BaseViewController: UIViewController {
label.translatesAutoresizingMaskIntoConstraints = false
label.textAlignment = .center
label.numberOfLines = 0
label.text = "Click the button below to open next viewController"
label.text = "Click the button below to open next viewController\n(The current screen is written in the basic way of writing the view in code.)"
return label
}()

Expand All @@ -36,6 +36,14 @@ class BaseViewController: UIViewController {
button.setTitleColor(UIColor.systemBlue, for: .normal)
return button
}()

private var showCircleButton: UIButton = {
let button = UIButton()
button.translatesAutoresizingMaskIntoConstraints = false
button.setTitle("Circle", for: .normal)
button.setTitleColor(UIColor.systemBlue, for: .normal)
return button
}()

override func viewDidLoad() {
super.viewDidLoad()
Expand All @@ -45,7 +53,7 @@ class BaseViewController: UIViewController {
NSLayoutConstraint.activate([
explainLabel.leadingAnchor.constraint(equalTo: self.view.leadingAnchor, constant: 20),
explainLabel.trailingAnchor.constraint(equalTo: self.view.trailingAnchor, constant: -20),
explainLabel.centerYAnchor.constraint(equalTo: self.view.centerYAnchor)
explainLabel.centerYAnchor.constraint(equalTo: self.view.centerYAnchor, constant: -40)
])

self.view.addSubview(showStackButton)
Expand All @@ -60,9 +68,17 @@ class BaseViewController: UIViewController {
showTableButton.centerXAnchor.constraint(equalTo: self.view.centerXAnchor)
])

self.view.addSubview(showCircleButton)
NSLayoutConstraint.activate([
showCircleButton.topAnchor.constraint(equalTo: self.showTableButton.bottomAnchor, constant: 20),
showCircleButton.centerXAnchor.constraint(equalTo: self.view.centerXAnchor)
])

showStackButton.addTarget(self, action: #selector(openStackEmbedViewController), for: .touchUpInside)

showTableButton.addTarget(self, action: #selector(openTableViewEmbedViewController), for: .touchUpInside)

showCircleButton.addTarget(self, action: #selector(openCircleViewController), for: .touchUpInside)
}


Expand All @@ -82,6 +98,11 @@ class BaseViewController: UIViewController {
openNext(nextViewController: dest)
}

@objc private func openCircleViewController() {
let dest = CircleViewController()
openNext(nextViewController: dest)
}


private func openNext(nextViewController: UIViewController) {
let navigationController = UINavigationController(navigationBarClass: nil,
Expand Down
60 changes: 60 additions & 0 deletions Example/CoolLayout/CircleViewController.swift
Original file line number Diff line number Diff line change
@@ -0,0 +1,60 @@
//
// CircleViewController.swift
// CoolLayout_Example
//
// Created by Sudo.park on 2019/11/30.
// Copyright © 2019 CocoaPods. All rights reserved.
//

import UIKit

import CoolLayout


class CircleViewController: UIViewController {

private let circleView = UIView {
$0.backgroundColor = UIColor.blue
}

private let label = UILabel {
$0.textColor = UIColor.black
$0.textAlignment = .center
$0.numberOfLines = 0
$0.font = UIFont.boldSystemFont(ofSize: 18)
}

override func viewDidLoad() {
super.viewDidLoad()

self.view.apply {
$0.backgroundColor = UIColor.white
$0.addSubview(circleView)
$0.addSubview(label)
}

self.circleView
.activate {
$0.centerXAnchor.equal(self.view.centerXAnchor)
$0.centerYAnchor.equal(self.view.centerYAnchor)
$0.widthAnchor.equal(100)
$0.heightAnchor.equal(100)
}
self.circleView
.apply {
$0.layoutIfNeeded()
$0.clipsToBounds = true
$0.layer.cornerRadius = $0.frame.width / 2
}

self.label.apply {
$0.text = "This method builds faster than using a custom operator."
}
.activate {
$0.centerXAnchor.equal(self.view.centerXAnchor)
$0.topAnchor.equal(self.circleView.bottomAnchor + 50)
$0.leadingAnchor.greaterThan(orEqual: self.view.leadingAnchor + 20)
$0.trailingAnchor.lessThan(orEqual: self.view.trailingAnchor + -20)
}
}
}

0 comments on commit 35068d8

Please sign in to comment.