Skip to content

Commit 4181f01

Browse files
authored
Merge pull request #11 from SwiftUIExtensions/grid-pattern
Grid pattern
2 parents f168144 + 65511e8 commit 4181f01

File tree

8 files changed

+134
-0
lines changed

8 files changed

+134
-0
lines changed

Examples/ShapesExamples iOS/ContentView.swift

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -22,6 +22,15 @@ struct ContentView: View {
2222
}
2323
}
2424
.tag(1)
25+
26+
PatternsView()
27+
.tabItem {
28+
VStack {
29+
Image(systemName: "rectangle.split.3x3")
30+
Text("Patterns")
31+
}
32+
}
33+
.tag(2)
2534
}
2635
}
2736
}

Examples/ShapesExamples macOS/ContentView.swift

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,12 @@ struct ContentView: View {
1616
Text("Lines")
1717
}
1818
.tag(1)
19+
20+
PatternsView()
21+
.tabItem {
22+
Text("Patterns")
23+
}
24+
.tag(2)
1925
}
2026
.frame(maxWidth: .infinity, maxHeight: .infinity)
2127
}

Examples/ShapesExamples.xcodeproj/project.pbxproj

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -24,6 +24,8 @@
2424
FABCDB7C2364E11F00842ED9 /* Preview Assets.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = FABCDB7B2364E11F00842ED9 /* Preview Assets.xcassets */; };
2525
FABCDB7F2364E11F00842ED9 /* Main.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = FABCDB7D2364E11F00842ED9 /* Main.storyboard */; };
2626
FABCDB872364E16500842ED9 /* Shapes in Frameworks */ = {isa = PBXBuildFile; productRef = FABCDB862364E16500842ED9 /* Shapes */; };
27+
FAFBB70F2393106600E70575 /* PatternsView.swift in Sources */ = {isa = PBXBuildFile; fileRef = FAFBB70E2393106600E70575 /* PatternsView.swift */; };
28+
FAFBB7102393106600E70575 /* PatternsView.swift in Sources */ = {isa = PBXBuildFile; fileRef = FAFBB70E2393106600E70575 /* PatternsView.swift */; };
2729
/* End PBXBuildFile section */
2830

2931
/* Begin PBXFileReference section */
@@ -46,6 +48,7 @@
4648
FABCDB7E2364E11F00842ED9 /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; name = Base; path = Base.lproj/Main.storyboard; sourceTree = "<group>"; };
4749
FABCDB802364E11F00842ED9 /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = "<group>"; };
4850
FABCDB812364E11F00842ED9 /* ShapesExamples_macOS.entitlements */ = {isa = PBXFileReference; lastKnownFileType = text.plist.entitlements; path = ShapesExamples_macOS.entitlements; sourceTree = "<group>"; };
51+
FAFBB70E2393106600E70575 /* PatternsView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = PatternsView.swift; sourceTree = "<group>"; };
4952
/* End PBXFileReference section */
5053

5154
/* Begin PBXFrameworksBuildPhase section */
@@ -145,6 +148,7 @@
145148
children = (
146149
FA86726D238DE61500226819 /* RegularPolygonsView.swift */,
147150
FA867270238DE6CD00226819 /* LinesView.swift */,
151+
FAFBB70E2393106600E70575 /* PatternsView.swift */,
148152
);
149153
path = ShapesExamples;
150154
sourceTree = "<group>";
@@ -264,6 +268,7 @@
264268
FABCDB5B2364DF8400842ED9 /* SceneDelegate.swift in Sources */,
265269
FABCDB5D2364DF8400842ED9 /* ContentView.swift in Sources */,
266270
FA86726E238DE61500226819 /* RegularPolygonsView.swift in Sources */,
271+
FAFBB70F2393106600E70575 /* PatternsView.swift in Sources */,
267272
);
268273
runOnlyForDeploymentPostprocessing = 0;
269274
};
@@ -274,6 +279,7 @@
274279
FA86726F238DE61500226819 /* RegularPolygonsView.swift in Sources */,
275280
FA867272238DE6CD00226819 /* LinesView.swift in Sources */,
276281
FABCDB772364E11E00842ED9 /* ContentView.swift in Sources */,
282+
FAFBB7102393106600E70575 /* PatternsView.swift in Sources */,
277283
FABCDB752364E11E00842ED9 /* AppDelegate.swift in Sources */,
278284
);
279285
runOnlyForDeploymentPostprocessing = 0;
Lines changed: 38 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,38 @@
1+
import SwiftUI
2+
import Shapes
3+
4+
struct PatternsView: View {
5+
var body: some View {
6+
ScrollView {
7+
GridPattern(horizontalLines: 20, verticalLines: 40)
8+
.stroke(Color.white.opacity(0.3), style: .init(lineWidth: 1, lineCap: .round))
9+
.frame(height: 200)
10+
.background(Color.blue)
11+
.padding()
12+
13+
14+
LinearGradient(gradient: Gradient(colors: [.orange, .red, .blue, .purple]), startPoint: .topLeading, endPoint: .bottomTrailing)
15+
.frame(height: 200)
16+
.clipShape(
17+
GridPattern(horizontalLines: 25, verticalLines: 25).inset(by: 1).stroke(lineWidth: 1)
18+
)
19+
.padding()
20+
21+
LinearGradient(gradient: Gradient(colors: [.purple, .red, .orange]), startPoint: .topLeading, endPoint: .bottomTrailing)
22+
.frame(height: 200)
23+
.clipShape(
24+
GridPattern(horizontalLines: 10)
25+
.inset(by: 2)
26+
.stroke(style: .init(lineWidth: 4, lineCap: .round, lineJoin: .round, miterLimit: 2, dash: [10], dashPhase: 0))
27+
)
28+
.padding()
29+
30+
}
31+
}
32+
}
33+
34+
struct PatternsView_Previews: PreviewProvider {
35+
static var previews: some View {
36+
PatternsView()
37+
}
38+
}

README.md

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -27,6 +27,19 @@ QuadCurve(unitPoints: [
2727
.frame(height: 200)
2828
```
2929

30+
## Patterns
31+
<center>
32+
<img src="Resources/patterns.png"/>
33+
</center>
34+
35+
```swift
36+
GridPattern(horizontalLines: 20, verticalLines: 40)
37+
.stroke(Color.white.opacity(0.3), style: .init(lineWidth: 1, lineCap: .round))
38+
.frame(height: 200)
39+
.background(Color.blue)
40+
.padding()
41+
```
42+
3043
## How to use
3144

3245
Add this swift package to your project

Resources/patterns.png

545 KB
Loading
Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,8 @@
1+
import SwiftUI
2+
3+
public extension Path {
4+
mutating func addLine(from p1: CGPoint, to p2: CGPoint) {
5+
self.move(to: p1)
6+
self.addLine(to: p2)
7+
}
8+
}
Lines changed: 54 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,54 @@
1+
import SwiftUI
2+
3+
public struct GridPattern: InsettableShape {
4+
private let inset: CGFloat
5+
private let horizontalLines: Int
6+
private let verticalLines: Int
7+
8+
9+
public func inset(by amount: CGFloat) -> GridPattern {
10+
GridPattern(inset: self.inset + amount, horizontalLines: self.horizontalLines, verticalLines: self.verticalLines)
11+
}
12+
13+
public func path(in rect: CGRect) -> Path {
14+
let rect = rect.insetBy(dx: self.inset, dy: self.inset)
15+
16+
return Path { path in
17+
/// Horizontal Lines
18+
if horizontalLines > 1 {
19+
let unitDistanceBetweenHorizontalLines = 1.0 / CGFloat(horizontalLines - 1)
20+
21+
(0..<horizontalLines).forEach { index in
22+
let unitY = unitDistanceBetweenHorizontalLines * CGFloat(index)
23+
let fromPoint = CGPoint(unitPoint: UnitPoint(x: 0, y: unitY), in: rect)
24+
let toPoint = CGPoint(unitPoint: UnitPoint(x: 1, y: unitY), in: rect)
25+
path.addLine(from: fromPoint, to: toPoint)
26+
}
27+
}
28+
29+
if verticalLines > 1 {
30+
let unitDistanceBetweenVerticalLines = 1.0 / CGFloat(verticalLines - 1)
31+
32+
(0..<verticalLines).forEach { index in
33+
let unitX = unitDistanceBetweenVerticalLines * CGFloat(index)
34+
let fromPoint = CGPoint(unitPoint: UnitPoint(x: unitX, y: 0), in: rect)
35+
let toPoint = CGPoint(unitPoint: UnitPoint(x: unitX, y: 1), in: rect)
36+
path.addLine(from: fromPoint, to: toPoint)
37+
}
38+
}
39+
}
40+
.offsetBy(dx: inset, dy: inset)
41+
}
42+
43+
private init(inset: CGFloat, horizontalLines: Int, verticalLines: Int) {
44+
self.inset = inset
45+
self.horizontalLines = horizontalLines
46+
self.verticalLines = verticalLines
47+
}
48+
49+
public init(horizontalLines: Int = 0, verticalLines: Int = 0) {
50+
self.inset = 0
51+
self.horizontalLines = horizontalLines
52+
self.verticalLines = verticalLines
53+
}
54+
}

0 commit comments

Comments
 (0)