0

我正在尝试根据另一个值获取进度条的进度值。这两个变量(waterQuantity 和 progress)都在属性包装器@State

这是我的代码:

struct CircularProgressBar: View {
@State var waterQuantity: Int
@State var progress: Float = (1 + (Float(waterQuantity)/Float(1500))) * 100

var body: some View {
    ZStack {
        Circle()
            .foregroundColor(.white)
            .padding(25)
            .overlay(
                Circle()
                    .trim(from: 0.0, to: CGFloat(min(self.progress, 1.0)))
                    .stroke(style: StrokeStyle(lineWidth: 25
                        , lineCap: .round, lineJoin: .round))
                    .foregroundColor(Color.blue)
                    .rotationEffect(Angle(degrees: 270.0))
                    .animation(.linear)
                    .padding(50)
        )
        
        VStack {
            Text(String(format: "%.0i mL", 500))
                .font(.largeTitle)
                .bold()
                .foregroundColor(Color("bgStart"))
            Text("1500 mL")
                .foregroundColor(.gray)
        }
    }
}

如您所见,我无法使用另一个尚未初始化的变量来初始化进度。我尝试使用 init() 和 mutating func 传递值,但这些解决方案都不适合我

4

2 回答 2

2

你可能不需要做这个

@State var progress: Float = Float(waterQuantity)/Float(1500)

只留下一个属性waterQuantity 并将该代码复制粘贴到视图主体中,并在waterQuantity更改时刷新

于 2020-07-12T13:20:45.110 回答
2

您应该将进度更改为不存储任何值的计算属性,而是根据 waterQuantity 的值动态计算其值:

var progress: Float {
    Float(waterQuantity)/Float(1500)
}

现在当 waterQuantity 被更新时,你的视图仍然会被重绘,因为 waterQuantity 在这个计算属性中被使用,而它又被用在你的视图中。

于 2020-07-12T23:58:17.003 回答