How to Change SwiftUI ProgressView Size

Alexey Karimov

The ProgressView in SwiftUI is your go-to component for showing ongoing tasks — whether you’re loading data, syncing files, or waiting on a server response. But the default spinner or bar might not always suit your layout.

In this guide, we’ll show you how to customize the SwiftUI ProgressView size using the right modifiers, and how to work around limitations on older iOS versions.

What Is a ProgressView in SwiftUI?

ProgressView is SwiftUI’s way of indicating that a task is in progress. Depending on the context, you can use it as:

  • An indeterminate spinner when the duration is unknown (like loading a web request),
  • Or a determinate progress bar when you know how far along the task is (like file uploads or download completion).

You can also attach labels or icons, customize styling, and, most importantly, adjust SwiftUI ProgressView size to your design needs.

Adjusting SwiftUI ProgressView Size with .controlSize(_) (iOS 16+)

Starting with iOS 16, Apple introduced a much more native way to control the size of ProgressView using the .controlSize(_:) modifier. This aligns the component with other SwiftUI controls like Button or TextField.

There are four available control sizes:

  • .mini
  • .small
  • .regular (default)
  • .large

Here’s an example of how you might apply them:

struct LoadingVariantsView: View {
    var body: some View {
        VStack(spacing: 16) {
            ProgressView("Mini")
                .controlSize(.mini)
            ProgressView("Small")
                .controlSize(.small)
            ProgressView("Regular")
                .controlSize(.regular)
            ProgressView("Large")
                .controlSize(.large)
        }
        .padding()
    }
}

Pro Tip: Using .controlSize(.large) can help your progress indicator stand out on full-screen loading states, while .mini or .small work well in tight layouts or list rows.

Scaling ProgressView on iOS 15 and Earlier

Unfortunately, before iOS 16, there was no built-in way to resize a ProgressView. Instead, you can use the .scaleEffect() modifier to enlarge or shrink the view.

ProgressView("Loading...")
    .scaleEffect(1.6)

While this does increase the visual size, it has drawbacks:

  • The frame around the view doesn’t resize with it, which can affect layout.
  • On high scale values, the progress view may appear slightly blurred.
  • It doesn’t always behave like a native component.

That said, for iOS 15 compatibility, .scaleEffect() is still a practical workaround — just be mindful of layout alignment issues.

When to Change the ProgressView Size?

Customizing the SwiftUI ProgressView size isn’t just about visual preference. It helps:

  • Create visual hierarchy: Larger spinners indicate more critical operations.
  • Fit well within your UI: Small indicators suit inline use in lists or cards.
  • Match the tone of your app: Larger sizes feel more prominent in onboarding or blocking tasks, while smaller ones keep things subtle.