In this post we’ll learn how to:
- Create a shape with stroke
- Create a dashed stroke
- Create a dashed line
Create a shape with stroke
Begin by creating a yellow ellipse with an orange border:
struct ContentView: View {
var body: some View {
VStack {
Ellipse()
.stroke(style: StrokeStyle(lineWidth: 4))
.foregroundStyle(.orange)
.background(Ellipse().fill(.yellow))
.frame(width: 200, height: 150)
}
}
}
We start by creating an ellipse, then add a border with a lineWidth of four. Next, set the color for the stroke, followed by adding a yellow ellipse as the background. Finally, set the dimensions for the entire shape.

We can have the same result with this code:
VStack {
Ellipse()
.strokeBorder(.orange, lineWidth: 4)
.background(Ellipse().fill(.yellow))
.frame(width: 200, height: 150)
}
Create a stroke dashed
So, why do we need the StrokeStyle? It’s used to create a dashed stroke:

The code:
Ellipse()
.stroke(style: StrokeStyle(lineWidth: 4, dash: [10]))
.foregroundStyle(.orange)
.background(Ellipse().fill(.yellow))
.frame(width: 200, height: 150)
We can observe a new parameter, dash. It’s an array that contains the sizes of the dashes and spaces. For example, with dash[10, 2], we get:

We can achieve the same result as in the first example by overlapping the ellipse using a ZStack:
ZStack {
Ellipse()
.strokeBorder(.red, lineWidth: 2)
.frame(width: 200, height: 150)
Ellipse()
.foregroundStyle(.yellow)
.padding(2)
.frame(width: 200, height: 150)
}
In this case, the second ellipse has padding equal to the lineWidth of the first one.
Create a line (dashed)
In SwiftUI, a Line shape doesn’t exist natively, so we have to create it using the Shape protocol:
struct Line: Shape {
var y2: CGFloat = 0.0
func path(in rect: CGRect) -> Path {
var path = Path()
path.move(to: CGPoint(x: 0, y: 0))
path.addLine(to: CGPoint(x: rect.width, y: y2))
return path
}
}
The line is drawn inside a virtual rectangle; by default, it is horizontal. However, if we pass a value for y2, we get an inclined line.
struct ContentView: View {
var body: some View {
HStack {
Spacer(minLength: 20)
Line()
.stroke(style: StrokeStyle(lineWidth: 1, dash: [5]))
.foregroundStyle(.orange)
.frame(height: 1)
Spacer(minLength: 10)
}
}
}

That’all for this post.