18
            Jul
            2022
        
                            
    SwiftUI Gauge Cheatsheet
Reading time: 1 min
This recipe is a cheatsheet on all the possible SwiftUI Gauge styles, as well as how to set tint and all the labels.
You can see the cheatsheet below and the takeaways here:

Gauge is available starting in SwiftUI 4 (iOS 16, macOS 12.4).
Here's the code used to produce the view shown above. As you can see, Gauge views were configured to their fullest extent, with a label, currentValueLabel, minimumValueLabel, maximumValueLabel, style and tint.
struct GaugeViewCheatsheet: View {
  @State private var current = 33.0
  @State private var minimum = 20.0
  @State private var maximum = 60.0
  var body: some View {
    VStack(spacing: 20) {
      embeddedGauge(title: "Default") {
        gauge.gaugeStyle( DefaultGaugeStyle())
      }
      embeddedGauge(title: "Accessory Linear") {
        gauge.gaugeStyle( AccessoryLinearGaugeStyle())
      }
      embeddedGauge(title: "Linear Capacity") {
        gauge.gaugeStyle( LinearCapacityGaugeStyle())
      }
      embeddedGauge(title: "Accessory Linear Capacity") {
        gauge.gaugeStyle( AccessoryLinearCapacityGaugeStyle())
      }
      embeddedGauge(title: "Accessory Circular") {
        gauge.gaugeStyle( AccessoryCircularGaugeStyle())
      }
      embeddedGauge(title: "Accessory Circular Capacity") {
        gauge.gaugeStyle( AccessoryCircularCapacityGaugeStyle())
      }
    }
    .padding()
  }
  private var gauge: some View {
    Gauge(value: current, in: minimum...maximum) {
      Image(systemName: "sun.max")
        .font(.caption)
    } currentValueLabel: {
      Text("\(Int(current))")
    } minimumValueLabel: {
      Text("\(Int(minimum))")
        .foregroundColor(.green)
    } maximumValueLabel: {
      Text("\(Int(maximum))")
        .foregroundColor(.pink)
    }
    .tint(Gradient(colors: [.green, .yellow, .orange, .red, .pink]))
  }
  @ViewBuilder private func embeddedGauge<StyledGauge: View>(
    title: String, 
    @ViewBuilder gauge: () -> StyledGauge
  ) -> some View {
    VStack {
      Text(title)
        .font(.headline)
      gauge()
    }
  }
}Here are the takeaways from the cheatsheet:
- .linearCapacityis the- .defaultstyle.
- Only .linearCapacity/.defaultand.accessoryLinearCapacityshow thelabelview.
- All styles except .accessoryCircularCapacityshow theminimumValueLabelandmaximumValueLabelviews.
- All styles except .accessoryLinearshow thecurrentValueLabelview.
- Gradient tintis is applied vertically to.linearCapacity/.defaultand horizontally to.accessoryLinearand.accessoryCircular. In the case of.accessoryLinearCapacityand.accessoryCircularCapacity, only the first color of the gradient is used.