Custom view for a HealthKit project that uses SwiftUI Gauge to show the progress of tracking the number of reading needed for the day.

Customizations

  • Reading Count
  • Number of Readings
  • Gauge line color
  • Biomarker icon (SF Symbols)
  • Biomarker base color
  • Biomarker progress bae color

Use in your code

BiomarkerView(
      readingCount: readingCount,
      minReading: 0,
      maxReading: 3,
      baseColor: .gray.opacity(0.5),
      progressColor: .red,
      icon: "drop",
      readingType: "Blood Glucose")

BiomarkerView

struct BiomarkerView: View {
  @State private var readingCount: Double = 1
  var minReading: Double = 0
  var maxReading: Double = 3
  var baseColor: Color = .gray.opacity(0.5)
  var progressColor: Color = .red
  var icon: String
  var readingType: String
  
  var gaugeValue: Double {
    readingCount / maxReading
  }
  
  var gaugeRange: ClosedRange<Double> {
    minReading...maxReading
  }
  var body: some View {
    ZStack {
      RoundedRectangle(cornerRadius: 25)
        .stroke(baseColor, lineWidth: 3)
        .frame(width: 175, height: 175)
      VStack {
        Gauge(value: gaugeValue) { }
      currentValueLabel: {
        HStack(spacing: 0) {
          Image(systemName: "plus")
            .foregroundStyle(progressColor)
          ZStack {
            Image(systemName: icon)
              .resizable()
              .scaledToFit()
              .foregroundStyle(.red)
            Image(systemName: "\(icon).fill")
              .resizable()
              .scaledToFit()
              .foregroundStyle(progressColor.opacity(0.5))
          }
          .frame(height: 20)
        }
        
        HStack(spacing: 0) {
          Text("\(String(format: "%.0f", readingCount))")
          Text("/\(String(format: "%.0f", maxReading))")
            .foregroundStyle(.secondary)
        }
      }
      .gaugeStyle(BioMarkGaugeStyle())
        
        Text(readingType)
        Text("At least \(String(format: "%.0f", maxReading))x/day")
          .font(.caption)
          .foregroundStyle(.secondary)
      }
    }
  }
  
  init(readingCount: Double, minReading: Double, maxReading: Double, baseColor: Color, progressColor: Color, icon: String, readingType: String) {
    _readingCount = State(initialValue: readingCount)
    self.minReading = minReading
    self.maxReading = maxReading
    self.baseColor = baseColor
    self.progressColor = progressColor
    self.icon = icon
    self.readingType = readingType
  }
}

You can download the code for this project on GitHub