这个嵌套的环形 UI 运行良好,但我如何对其进行编码,以便无论其父项是非常小还是非常大,它都可以缩放?
import SwiftUI
struct CustomGaugeStyleView: View {
@State private var innerRingFill = 6.5
var body: some View {
Gauge(value: innerRingFill, in: 0...10) {
Image(systemName: "gauge.medium")
.font(.system(size: 50.0))
} currentValueLabel: {
Text("\(innerRingFill.formatted(.number))")
}
.gaugeStyle(twoRingGaugeStyle(outerRingMin: 5.5, outerRingMax: 7.5))
}
}
struct CustomGaugeStyleView_Previews: PreviewProvider {
static var previews: some View {
CustomGaugeStyleView()
}
}
struct twoRingGaugeStyle: GaugeStyle {
var outerRingMin: Double
var outerRingMax: Double
func makeBody(configuration: Configuration) -> some View {
GeometryReader { geometry in
ZStack {
Circle()
.stroke(Color(.lightGray).opacity(0.2), style: StrokeStyle(lineWidth: 20))
.frame(height: geometry.size.height * 0.70)
Circle()
.trim(from: 0, to: 0.75 * configuration.value)
.stroke(Color.orange.gradient, style: StrokeStyle(lineWidth: 20, lineCap: .round, lineJoin: .round))
.rotationEffect(.degrees(270))
.frame(height: geometry.size.height * 0.70)
Circle()
.trim(from: outerRingMin / 10, to: outerRingMax / 10)
.stroke(Color.green.gradient, style: StrokeStyle(lineWidth: 20, lineCap: .round, lineJoin: .round))
.rotationEffect(.degrees(270))
.frame(height: geometry.size.height * 0.82)
}
.padding()
}
.aspectRatio(contentMode: .fit)
}
}
第一个图像是没有任何框架尺寸的视图,第二个视图是添加
.frame(height: 100)
到Gauge.
我自己运行了你的代码,我检查了绿色 Circle() 的原始值是不正确的。
GeometryReader { geometry in
ZStack {
Circle()
.stroke(Color(.lightGray).opacity(0.2), style: StrokeStyle(lineWidth: 20))
.frame(height: geometry.size.height * 0.70)
Circle()
.trim(from: 0, to: 0.75 * configuration.value)
.stroke(Color.orange.gradient, style: StrokeStyle(lineWidth: 20, lineCap: .round, lineJoin: .round))
.rotationEffect(.degrees(270))
.frame(height: geometry.size.height * 0.70)
Circle()
.trim(from: outerRingMin / 10, to: outerRingMax / 10)
.stroke(Color.green.gradient, style: StrokeStyle(lineWidth: 20, lineCap: .round, lineJoin: .round))
.rotationEffect(.degrees(270))
.frame(height: geometry.size.height * 0.70) // 0.82 -> 0.70
}
.padding()
}
.aspectRatio(contentMode: .fit)
我认为这只是一个简单的错误。