Skip to content

Commit 4099817

Browse files
author
coderchan
committed
SwiftlyUI V1.1.11
1 parent 8d6ca9f commit 4099817

7 files changed

+75
-22
lines changed

Example/Example/ViewController.swift

Lines changed: 23 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -30,26 +30,41 @@ class ViewController: UIViewController {
3030
super.viewDidLoad()
3131
view.backgroundColor = .white
3232
print("viewDidLoad")
33-
33+
test3()
34+
}
35+
func test4() {
36+
let abf: String? = nil
37+
let flag = true
38+
HStackView {
39+
if let abf = abf {
40+
UILabel()
41+
42+
}
43+
if flag {
44+
UILabel()
45+
}
46+
UILabel()
47+
}
3448
}
35-
3649
func test3() {
3750
let view1 = UIView()
3851
.backgroundColor(.red)
3952
.frame(width: 100, height: 100)
4053
.centerX(to: view)
4154
.centerY(to: view)
55+
.roundCorners(10, corners: [.topLeft, .bottomRight])
4256
view.addSubview(view1)
43-
4457
let view2 = UIView()
4558
.backgroundColor(.blue)
4659

4760

48-
view1.addSubview(view2)
49-
view2.leadingToSuper(offset: 10)
50-
view2.trailingToSuper(offset: 20)
51-
view2.topToSuper(offset: 0)
52-
view2.bottomToSuper(offset: 0)
61+
// view1.addSubview(view2)
62+
// view2.leadingToSuper(offset: 10)
63+
// view2.trailingToSuper(offset: 20)
64+
// view2.topToSuper(offset: 0)
65+
// view2.bottomToSuper(offset: 0)
66+
67+
5368
// view2.fillSuper(edge: UIEdgeInsets(top: 0, left: 0, bottom: 0, right: 20))
5469
}
5570

SwiftlyUI.podspec

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
Pod::Spec.new do |s|
22
s.name = 'SwiftlyUI'
3-
s.version = '1.1.10'
3+
s.version = '1.1.11'
44
s.summary = 'Swift-style declarative UIKit Plus'
55
s.homepage = 'https://github.com/CoderLineChan/SwiftlyUI'
66
s.license = { :type => 'MIT', :file => 'LICENSE' }

SwiftlyUI/Source/Core/UIBackgroundConfiguration+SwiftlyUI.swift

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -14,7 +14,7 @@ import UIKit
1414
public extension UIBackgroundConfiguration {
1515

1616
@discardableResult
17-
func customView(@ViewBuilder content: () -> [UIView]) -> UIBackgroundConfiguration {
17+
func customView(@SwiftlyUIBuilder content: () -> [UIView]) -> UIBackgroundConfiguration {
1818
var newConfig = self
1919
newConfig.customView = content().last
2020
return newConfig

SwiftlyUI/Source/Core/UIControl+SwiftlyUI.swift

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -9,21 +9,21 @@ import UIKit
99

1010
public extension UIControl {
1111

12-
convenience init(_ action: @escaping () -> Void, @ViewBuilder content: () -> [UIView]) {
12+
convenience init(_ action: @escaping () -> Void, @SwiftlyUIBuilder content: () -> [UIView]) {
1313
self.init(content: content, action: action)
1414
}
1515

16-
convenience init<T: UIControl>(_ action: @escaping (T) -> Void, @ViewBuilder content: () -> [UIView]) {
16+
convenience init<T: UIControl>(_ action: @escaping (T) -> Void, @SwiftlyUIBuilder content: () -> [UIView]) {
1717
self.init(content: content, action: action)
1818
}
1919

20-
convenience init(@ViewBuilder content: () -> [UIView], action: @escaping () -> Void) {
20+
convenience init(@SwiftlyUIBuilder content: () -> [UIView], action: @escaping () -> Void) {
2121
self.init(content: content) { _ in
2222
action()
2323
}
2424
}
2525

26-
convenience init<T: UIControl>(@ViewBuilder content: () -> [UIView], action: @escaping (T) -> Void) {
26+
convenience init<T: UIControl>(@SwiftlyUIBuilder content: () -> [UIView], action: @escaping (T) -> Void) {
2727
self.init(frame: .zero)
2828
let views = content()
2929
setCanActiveLayout(false, forViews: views)

SwiftlyUI/Source/Core/UIStackView+SwiftlyUI.swift

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -16,7 +16,7 @@ public final class VStackView: UIStackView {
1616
}
1717

1818
@discardableResult
19-
public convenience init(spacing: CGFloat = 0, @ViewBuilder content: () -> [UIView]) {
19+
public convenience init(spacing: CGFloat = 0, @SwiftlyUIBuilder content: () -> [UIView]) {
2020
self.init(frame: .zero)
2121
self.axis = .vertical
2222
self.spacing = spacing
@@ -50,7 +50,7 @@ public final class HStackView: UIStackView {
5050
}
5151

5252
@discardableResult
53-
public convenience init(spacing: CGFloat = 0, @ViewBuilder content: () -> [UIView]) {
53+
public convenience init(spacing: CGFloat = 0, @SwiftlyUIBuilder content: () -> [UIView]) {
5454
self.init(frame: .zero)
5555
self.axis = .horizontal
5656
self.spacing = spacing

SwiftlyUI/Source/Core/UIView+SwiftlyUI.swift

Lines changed: 34 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -92,6 +92,20 @@ public extension UIView {
9292
return self
9393
}
9494

95+
@discardableResult
96+
func roundCorners(_ radius: CGFloat, corners: UIRectCorner) -> Self {
97+
if self.bounds == .zero {
98+
cornerInfo = CornerInfo(radius: radius, corners: corners)
99+
return self
100+
}
101+
let maskPath = UIBezierPath(roundedRect: bounds, byRoundingCorners: corners, cornerRadii: CGSize(width: radius, height: radius))
102+
let maskLayer = CAShapeLayer()
103+
maskLayer.frame = bounds
104+
maskLayer.path = maskPath.cgPath
105+
layer.mask = maskLayer
106+
return self
107+
}
108+
95109
@discardableResult
96110
func backgroundColor(_ color: UIColor) -> Self {
97111
self.backgroundColor = color
@@ -111,7 +125,7 @@ public extension UIView {
111125
}
112126

113127
@discardableResult
114-
func background(@ViewBuilder content: () -> [UIView]) -> Self {
128+
func background(@SwiftlyUIBuilder content: () -> [UIView]) -> Self {
115129
subviews.forEach({ if $0.tag == backgroundViewTag { $0.removeFromSuperview() } })
116130
let subviews = content()
117131
subviews.forEach { sub in
@@ -181,7 +195,7 @@ public extension UIView {
181195
}
182196

183197
public final class ZStackView: UIView {
184-
public convenience init(@ViewBuilder content: () -> [UIView]) {
198+
public convenience init(@SwiftlyUIBuilder content: () -> [UIView]) {
185199
self.init(frame: .zero)
186200
let views = content()
187201
setCanActiveLayout(false, forViews: views)
@@ -1118,6 +1132,20 @@ extension UIView {
11181132

11191133
private static var constraintHolderKey: Void?
11201134
private static var constraintCanActiveKey: Void?
1135+
private static var pendingCornerInfoKey: Void?
1136+
1137+
var cornerInfo: CornerInfo? {
1138+
get {
1139+
if let info = objc_getAssociatedObject(self, &Self.pendingCornerInfoKey) as? CornerInfo {
1140+
return info
1141+
}else {
1142+
return nil
1143+
}
1144+
}
1145+
set {
1146+
objc_setAssociatedObject(self, &Self.pendingCornerInfoKey, newValue, .OBJC_ASSOCIATION_RETAIN_NONATOMIC)
1147+
}
1148+
}
11211149

11221150
var canActiveLayout: Bool {
11231151
get {
@@ -1345,6 +1373,10 @@ extension UIView {
13451373
if canActiveLayout {
13461374
safeActivateConstraints()
13471375
}
1376+
if let cornerInfo = cornerInfo, bounds != .zero {
1377+
roundCorners(cornerInfo.radius, corners: cornerInfo.corners)
1378+
self.cornerInfo = nil
1379+
}
13481380
}
13491381

13501382
private func handleDimensionConstraints(

SwiftlyUI/Source/Extension/UIViewExtensions.swift

Lines changed: 10 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -9,15 +9,16 @@ import UIKit
99

1010
// MARK: - ViewBuilder
1111
@resultBuilder
12-
public struct ViewBuilder {
13-
public static func buildBlock(_ components: UIView...) -> [UIView] { components }
12+
public struct SwiftlyUIBuilder {
13+
public static func buildBlock(_ components: [UIView]...) -> [UIView] { components.flatMap { $0 } }
1414
public static func buildBlock() -> [UIView] { [] }
1515
public static func buildOptional(_ component: [UIView]?) -> [UIView] { component ?? [] }
1616
public static func buildArray(_ components: [[UIView]]) -> [UIView] { components.flatMap { $0 } }
1717
public static func buildEither(first: [UIView]) -> [UIView] { first }
1818
public static func buildEither(second: [UIView]) -> [UIView] { second }
19-
public static func buildPartialBlock(first: UIView) -> [UIView] { [first] }
20-
public static func buildPartialBlock(accumulated: [UIView], next: UIView) -> [UIView] { accumulated + [next] }
19+
public static func buildPartialBlock(first: [UIView]) -> [UIView] { first }
20+
public static func buildPartialBlock(accumulated: [UIView], next: [UIView]) -> [UIView] { accumulated + next }
21+
public static func buildExpression(_ expression: UIView) -> [UIView] { [expression] }
2122
}
2223

2324
// MARK: - Padding Edge
@@ -253,6 +254,11 @@ public extension UIView {
253254
}
254255
}
255256

257+
struct CornerInfo {
258+
let radius: CGFloat
259+
let corners: UIRectCorner
260+
}
261+
256262
// MARK: - Gesture AssociatedKey
257263
extension UIView {
258264
fileprivate struct AssociatedKeys {

0 commit comments

Comments
 (0)