Skip to content

Instantly share code, notes, and snippets.

@globulus
Created June 29, 2021 15:27
Show Gist options
  • Save globulus/8d9815089767a15d3acb91a55c655e9b to your computer and use it in GitHub Desktop.
Save globulus/8d9815089767a15d3acb91a55c655e9b to your computer and use it in GitHub Desktop.
SwiftUI freeform drawing
struct DrawingPath {
private var points = [CGPoint]()
private var breaks = [Int]()
mutating func addPoint(_ point: CGPoint) {
points.append(point)
}
mutating func addBreak() {
breaks.append(points.count)
}
var path: Path {
var path = Path()
guard let firstPoint = points.first else { return path }
path.move(to: firstPoint)
for i in 1..<points.count {
if breaks.contains(i) {
path.move(to: points[i])
} else {
path.addLine(to: points[i])
}
}
return path
}
}
struct DrawShape: Shape {
let drawingPath: DrawingPath
func path(in rect: CGRect) -> Path {
drawingPath.path
}
}
struct DrawViewTest: View {
@State private var drawing: DrawingPath
var body: some View {
ZStack {
Color.white // drawing background
DrawShape(drawingPath: drawing)
.stroke(lineWidth: 5) // define stroke width
.foregroundColor(.blue) // define stroke color
}.gesture(DragGesture()
.onChanged( { value in
drawing.addPoint(value.location)
}).onEnded( { value in
drawing.addBreak()
}))
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment