Skip to main content

Customizing ProgressView with ProgressViewStyle

About 2 minSwiftSwiftUIArticle(s)bloghackingwithswift.comcrashcourseswiftswiftuixcodeappstore

Customizing ProgressView with ProgressViewStyle 관련

SwiftUI by Example

Back to Home

Customizing ProgressView with ProgressViewStyle | SwiftUI by Example

Customizing ProgressView with ProgressViewStyle

Updated for Xcode 15

SwiftUI gives us the ProgressViewStyle protocol to create custom designs for ProgressView, allowing us to read how complete the progress view and take that into account in our design.

To make a custom ProgressView style, you need to create a struct that has a makeBody() method accepting the current configuration of the view. You can then go ahead and render the progress however you want – perhaps a text percentage, perhaps a growing circle, and so on – then return your finished layout to be rendered.

To demonstrate this, here’s a custom style that creates a gauge, showing progress as a stroked circle that completes as progress ramps up:

struct GaugeProgressStyle: ProgressViewStyle {
    var strokeColor = Color.blue
    var strokeWidth = 25.0

    func makeBody(configuration: Configuration) -> some View {
        let fractionCompleted = configuration.fractionCompleted ?? 0

        return ZStack {
            Circle()
                .trim(from: 0, to: fractionCompleted)
                .stroke(strokeColor, style: StrokeStyle(lineWidth: strokeWidth, lineCap: .round))
                .rotationEffect(.degrees(-90))
        }
    }
}

// A view letting you adjust the progress with tap gestures
struct ContentView: View {
    @State private var progress = 0.2

    var body: some View {
        ProgressView(value: progress, total: 1.0)
            .progressViewStyle(GaugeProgressStyle())
            .frame(width: 200, height: 200)
            .contentShape(Rectangle())
            .onTapGesture {
                if progress < 1.0 {
                    withAnimation {
                        progress += 0.2
                    }
                }
            }
    }
}

Download this as an Xcode projectopen in new window

Notice how my custom style rotates the circle anti-clockwise by 90 degrees, so the circle draws it progress from the top.

Similar solutions…
How to show progress on a task using ProgressView | SwiftUI by Example

How to show progress on a task using ProgressView
How to show indeterminate progress using ProgressView | SwiftUI by Example

How to show indeterminate progress using ProgressView
Customizing Button with ButtonStyle | SwiftUI by Example

Customizing Button with ButtonStyle
Customizing Toggle with ToggleStyle | SwiftUI by Example

Customizing Toggle with ToggleStyle
Migrating from UIKit to SwiftUI | SwiftUI by Example

Migrating from UIKit to SwiftUI

이찬희 (MarkiiimarK)
Never Stop Learning.