瀏覽代碼

FastLayout First Commit

xcbosa 3 年之前
父節點
當前提交
a126cc4b4b

+ 0 - 3
Package.swift

@@ -21,8 +21,5 @@ let package = Package(
         .target(
             name: "FastLayout",
             dependencies: []),
-        .testTarget(
-            name: "FastLayoutTests",
-            dependencies: ["FastLayout"]),
     ]
 )

+ 52 - 0
Sources/FastLayout/FLAnchorWithOffset.swift

@@ -0,0 +1,52 @@
+//
+//  File.swift
+//  
+//
+//  Created by XCBOSA on 2021/12/4.
+//
+
+import UIKit
+
+public class FLAnchorWithOffset<AnchorType> where AnchorType: NSObject {
+    public private(set) var baseAnchor: NSLayoutAnchor<AnchorType>
+    public private(set) var offset: CGFloat
+    
+    init (withAnchor anchor: NSLayoutAnchor<AnchorType>, offset: CGFloat) {
+        self.baseAnchor = anchor
+        self.offset = offset
+    }
+}
+
+public func FLCreateAndActiveConstraint<AnchorType>(_ lhs: NSLayoutAnchor<AnchorType>, _ rhs: FLAnchorWithOffset<AnchorType>, method: (NSLayoutAnchor<AnchorType>, FLAnchorWithOffset<AnchorType>) -> NSLayoutConstraint) -> NSLayoutConstraint {
+    let constraint = method(lhs, rhs)
+    constraint.isActive = true
+    return constraint
+}
+
+extension NSLayoutDimension {
+    public static func + (lhs: NSLayoutDimension, rhs: CGFloat) -> FLAnchorWithOffset<NSLayoutDimension> {
+        FLAnchorWithOffset(withAnchor: lhs, offset: rhs)
+    }
+    public static func - (lhs: NSLayoutDimension, rhs: CGFloat) -> FLAnchorWithOffset<NSLayoutDimension> {
+        FLAnchorWithOffset(withAnchor: lhs, offset: -rhs)
+    }
+}
+
+extension NSLayoutXAxisAnchor {
+    public static func + (lhs: NSLayoutXAxisAnchor, rhs: CGFloat) -> FLAnchorWithOffset<NSLayoutXAxisAnchor> {
+        FLAnchorWithOffset(withAnchor: lhs, offset: rhs)
+    }
+    public static func - (lhs: NSLayoutXAxisAnchor, rhs: CGFloat) -> FLAnchorWithOffset<NSLayoutXAxisAnchor> {
+        FLAnchorWithOffset(withAnchor: lhs, offset: -rhs)
+    }
+}
+
+extension NSLayoutYAxisAnchor {
+    public static func + (lhs: NSLayoutYAxisAnchor, rhs: CGFloat) -> FLAnchorWithOffset<NSLayoutYAxisAnchor> {
+        FLAnchorWithOffset(withAnchor: lhs, offset: rhs)
+    }
+    public static func - (lhs: NSLayoutYAxisAnchor, rhs: CGFloat) -> FLAnchorWithOffset<NSLayoutYAxisAnchor> {
+        FLAnchorWithOffset(withAnchor: lhs, offset: -rhs)
+    }
+}
+

+ 76 - 3
Sources/FastLayout/FastLayout.swift

@@ -1,6 +1,79 @@
-public struct FastLayout {
-    public private(set) var text = "Hello, World!"
+import UIKit
 
-    public init() {
+extension NSLayoutDimension {
+    public static func == (lhs: NSLayoutDimension, rhs: NSLayoutDimension) -> NSLayoutConstraint {
+        FLCreateAndActiveConstraint(lhs, rhs) { $0.constraint(equalTo: $1) }
+    }
+    
+    public static func == (lhs: NSLayoutDimension, rhs: FLAnchorWithOffset<NSLayoutDimension>) -> NSLayoutConstraint {
+        FLCreateAndActiveConstraint(lhs, rhs) { $0.constraint(equalTo: $1.baseAnchor, constant: $1.offset) }
+    }
+    
+    public static func <= (lhs: NSLayoutDimension, rhs: NSLayoutDimension) -> NSLayoutConstraint {
+        FLCreateAndActiveConstraint(lhs, rhs) { $0.constraint(lessThanOrEqualTo: $1) }
+    }
+    
+    public static func <= (lhs: NSLayoutDimension, rhs: FLAnchorWithOffset<NSLayoutDimension>) -> NSLayoutConstraint {
+        FLCreateAndActiveConstraint(lhs, rhs) { $0.constraint(lessThanOrEqualTo: $1.baseAnchor, constant: $1.offset) }
+    }
+    
+    public static func >= (lhs: NSLayoutDimension, rhs: NSLayoutDimension) -> NSLayoutConstraint {
+        FLCreateAndActiveConstraint(lhs, rhs) { $0.constraint(greaterThanOrEqualTo: $1) }
+    }
+    
+    public static func >= (lhs: NSLayoutDimension, rhs: FLAnchorWithOffset<NSLayoutDimension>) -> NSLayoutConstraint {
+        FLCreateAndActiveConstraint(lhs, rhs) { $0.constraint(greaterThanOrEqualTo: $1.baseAnchor, constant: $1.offset) }
+    }
+}
+
+extension NSLayoutXAxisAnchor {
+    public static func == (lhs: NSLayoutXAxisAnchor, rhs: NSLayoutXAxisAnchor) -> NSLayoutConstraint {
+        FLCreateAndActiveConstraint(lhs, rhs) { $0.constraint(equalTo: $1) }
+    }
+    
+    public static func == (lhs: NSLayoutXAxisAnchor, rhs: FLAnchorWithOffset<NSLayoutXAxisAnchor>) -> NSLayoutConstraint {
+        FLCreateAndActiveConstraint(lhs, rhs) { $0.constraint(equalTo: $1.baseAnchor, constant: $1.offset) }
+    }
+    
+    public static func <= (lhs: NSLayoutXAxisAnchor, rhs: NSLayoutXAxisAnchor) -> NSLayoutConstraint {
+        FLCreateAndActiveConstraint(lhs, rhs) { $0.constraint(lessThanOrEqualTo: $1) }
+    }
+    
+    public static func <= (lhs: NSLayoutXAxisAnchor, rhs: FLAnchorWithOffset<NSLayoutXAxisAnchor>) -> NSLayoutConstraint {
+        FLCreateAndActiveConstraint(lhs, rhs) { $0.constraint(lessThanOrEqualTo: $1.baseAnchor, constant: $1.offset) }
+    }
+    
+    public static func >= (lhs: NSLayoutXAxisAnchor, rhs: NSLayoutXAxisAnchor) -> NSLayoutConstraint {
+        FLCreateAndActiveConstraint(lhs, rhs) { $0.constraint(greaterThanOrEqualTo: $1) }
+    }
+    
+    public static func >= (lhs: NSLayoutXAxisAnchor, rhs: FLAnchorWithOffset<NSLayoutXAxisAnchor>) -> NSLayoutConstraint {
+        FLCreateAndActiveConstraint(lhs, rhs) { $0.constraint(greaterThanOrEqualTo: $1.baseAnchor, constant: $1.offset) }
+    }
+}
+
+extension NSLayoutYAxisAnchor {
+    public static func == (lhs: NSLayoutYAxisAnchor, rhs: NSLayoutYAxisAnchor) -> NSLayoutConstraint {
+        FLCreateAndActiveConstraint(lhs, rhs) { $0.constraint(equalTo: $1) }
+    }
+    
+    public static func == (lhs: NSLayoutYAxisAnchor, rhs: FLAnchorWithOffset<NSLayoutYAxisAnchor>) -> NSLayoutConstraint {
+        FLCreateAndActiveConstraint(lhs, rhs) { $0.constraint(equalTo: $1.baseAnchor, constant: $1.offset) }
+    }
+    
+    public static func <= (lhs: NSLayoutYAxisAnchor, rhs: NSLayoutYAxisAnchor) -> NSLayoutConstraint {
+        FLCreateAndActiveConstraint(lhs, rhs) { $0.constraint(lessThanOrEqualTo: $1) }
+    }
+    
+    public static func <= (lhs: NSLayoutYAxisAnchor, rhs: FLAnchorWithOffset<NSLayoutYAxisAnchor>) -> NSLayoutConstraint {
+        FLCreateAndActiveConstraint(lhs, rhs) { $0.constraint(lessThanOrEqualTo: $1.baseAnchor, constant: $1.offset) }
+    }
+    
+    public static func >= (lhs: NSLayoutYAxisAnchor, rhs: NSLayoutYAxisAnchor) -> NSLayoutConstraint {
+        FLCreateAndActiveConstraint(lhs, rhs) { $0.constraint(greaterThanOrEqualTo: $1) }
+    }
+    
+    public static func >= (lhs: NSLayoutYAxisAnchor, rhs: FLAnchorWithOffset<NSLayoutYAxisAnchor>) -> NSLayoutConstraint {
+        FLCreateAndActiveConstraint(lhs, rhs) { $0.constraint(greaterThanOrEqualTo: $1.baseAnchor, constant: $1.offset) }
     }
 }

+ 88 - 0
Sources/FastLayout/Utils.swift

@@ -0,0 +1,88 @@
+//
+//  File.swift
+//  
+//
+//  Created by XCBOSA on 2021/12/4.
+//
+
+import UIKit
+
+extension UIView {
+    
+    public var left: NSLayoutXAxisAnchor {
+        self.translatesAutoresizingMaskIntoConstraints = false
+        return self.leftAnchor
+    }
+    
+    public var right: NSLayoutXAxisAnchor {
+        self.translatesAutoresizingMaskIntoConstraints = false
+        return self.rightAnchor
+    }
+    
+    public var leading: NSLayoutXAxisAnchor {
+        self.translatesAutoresizingMaskIntoConstraints = false
+        return self.leadingAnchor
+    }
+    
+    public var trailing: NSLayoutXAxisAnchor {
+        self.translatesAutoresizingMaskIntoConstraints = false
+        return self.trailingAnchor
+    }
+    
+    public var top: NSLayoutYAxisAnchor {
+        self.translatesAutoresizingMaskIntoConstraints = false
+        return self.topAnchor
+    }
+    
+    public var bottom: NSLayoutYAxisAnchor {
+        self.translatesAutoresizingMaskIntoConstraints = false
+        return self.bottomAnchor
+    }
+    
+    public var width: NSLayoutDimension {
+        self.translatesAutoresizingMaskIntoConstraints = false
+        return self.widthAnchor
+    }
+    
+    public var height: NSLayoutDimension {
+        self.translatesAutoresizingMaskIntoConstraints = false
+        return self.heightAnchor
+    }
+    
+    public var centerX: NSLayoutXAxisAnchor {
+        self.translatesAutoresizingMaskIntoConstraints = false
+        return self.centerXAnchor
+    }
+    
+    public var centerY: NSLayoutYAxisAnchor {
+        self.translatesAutoresizingMaskIntoConstraints = false
+        return self.centerYAnchor
+    }
+    
+    public var firstBaseLine: NSLayoutYAxisAnchor {
+        self.translatesAutoresizingMaskIntoConstraints = false
+        return self.firstBaselineAnchor
+    }
+    
+    public var lastBaseLine: NSLayoutYAxisAnchor {
+        self.translatesAutoresizingMaskIntoConstraints = false
+        return self.lastBaselineAnchor
+    }
+    
+    public func addSubViews(_ views: [UIView]) {
+        for view in views {
+            self.addSubview(view)
+        }
+    }
+    
+    public func configureSubView(_ views: UIView ...) {
+        self.addSubViews(views)
+    }
+    
+}
+
+public func FLCreateAndActiveConstraint<AnchorType>(_ lhs: NSLayoutAnchor<AnchorType>, _ rhs: NSLayoutAnchor<AnchorType>, method: (NSLayoutAnchor<AnchorType>, NSLayoutAnchor<AnchorType>) -> NSLayoutConstraint) -> NSLayoutConstraint {
+    let constraint = method(lhs, rhs)
+    constraint.isActive = true
+    return constraint
+}

+ 0 - 11
Tests/FastLayoutTests/FastLayoutTests.swift

@@ -1,11 +0,0 @@
-import XCTest
-@testable import FastLayout
-
-final class FastLayoutTests: XCTestCase {
-    func testExample() throws {
-        // This is an example of a functional test case.
-        // Use XCTAssert and related functions to verify your tests produce the correct
-        // results.
-        XCTAssertEqual(FastLayout().text, "Hello, World!")
-    }
-}