【Lebus的iOS开发教程】iOS16+SwiftUI4.0新功能实操演示-Gauge

1,087 阅读1分钟

Gauge-用来显示进度条或仪表

大家可以想象成是ProgressView和Slider的结合体

和ProgressView做对比:

struct ContentView: View {
    
    @State private var speed = 0.5
    
    var body: some View {
        VStack {
            ProgressView(value: speed) {
                Text("正在加载")
            }
            Gauge(value: speed) {
                Text("正在加载")
            }
        }
        .padding()
    }
}

image.png

上例的默认范围是0到1,所以参数为0.5的时候,就显示一半的进度条。

和Slider一样,也可以提供自定义范围:

struct ContentView: View {
    
    @State private var speed = 50.0
    
    var body: some View {
        VStack {
            Slider(value: $speed, in: 0...250) {
                Text("正在加载")
            } minimumValueLabel: {
                Text("0")
            } maximumValueLabel: {
                Text("250")
            }
            
            Gauge(value: speed, in: 0...250) {
                Text("正在加载")
            } currentValueLabel: {
                Text(Int(speed), format: .number)
            } minimumValueLabel: {
                Text("0")
            } maximumValueLabel: {
                Text("250")
            }
        }
        .padding()
    }
}

上述范围是0到250,所以speed是50的时候,显示5分之一进度条:

Gauge除了可以显示最大最小值处的文本,还可以显示’正在加载‘的文本,但不能像Slider一样拖动 image.png

Gauge独有功能-有很多style和color

总体预览:

image.png

先说style:

linearCapacity

struct ContentView: View {
    @State private var temp = 36.0
    
    private let minValue = 0.0
    private let maxValue = 100.0
    
    let gradient = Gradient(colors: [.green, .orange, .pink])
    
    var body: some View {
        VStack(spacing: 80) {
            Gauge(value: temp, in: minValue...maxValue) {
                Label("温度 (°C)", systemImage: "thermometer.medium")
            } currentValueLabel: {
                Text(Int(temp), format: .number)
            } minimumValueLabel: {
                Text("0")
            } maximumValueLabel: {
                Text("100")
            }
            Gauge(value: temp, in: minValue...maxValue) {
                Label("温度 (°C)", systemImage: "thermometer.medium")
            }
            Slider(value: $temp, in: minValue...maxValue)
        }
        .gaugeStyle(.linearCapacity) //看这里
        
        .padding()
    }
}

两个Gauge,一个是带全部参数的,一个是少量参数;一个Slider,用来控制数值。

此处给整体VStack加了gaugeStyle修饰符,应用于内部所有的Gauge。

然后指定style为linearCapacity,效果(也就是普通的进度条效果):

image.png

accessoryLinearCapacity:

这个进度条比较细

image.png

accessoryLinear

有一个黑色的圆圈表示当前值

image.png

accessoryCircular

仪表盘,第一个里面会显示当前值

image.png

accessoryCircularCapacity

全闭式仪表盘

image.png

再说color:

可以在Gauge后面加tint修饰符给他上色,这里使用渐变色

image.png