形状不会重新绘制自己。

3

当新数据成为“真相来源”时,我该如何使用新数据重新绘制形状? 以下示例显示,只有“Text(”...“)”视图随ObservedObject更新。Shape仅绘制一次。

import SwiftUI

struct ContentView: View {
    @ObservedObject var cntrl:Controller=Controller()
    var body: some View {
        VStack {
            subviewone(cntrl: cntrl)
            graph(cntrl: cntrl)
                .stroke()
                .fill(Color.red)
            subviewone(cntrl: cntrl)
        }.padding(.all)
    }
}

struct ContentView_Previews: PreviewProvider {
    static var previews: some View {
        ContentView()
    }
}

struct graph: Shape {
    @ObservedObject var cntrl:Controller
    func path(in rect: CGRect) -> Path {
        print("function beeing called")
        return Path { path in
            path.addArc(center: CGPoint(x: rect.midX, y: rect.midY), radius: CGFloat(100-cntrl.test), startAngle: Angle.init(degrees: 0), endAngle: Angle.init(degrees: 360), clockwise: true)
        }
    }


}

struct subviewone: View {
    @ObservedObject var cntrl:Controller
    var body: some View {
        VStack {
            Text("******")
            Text("\(cntrl.test)")
            Text("******")

        }

    }
}

class Controller:ObservableObject {

    @Published var test=0

    init() {
        _ = Timer.scheduledTimer(withTimeInterval: 1.0, repeats: true) {_ in
            self.test+=1
        }
    }

}

如果我省略.stroke()和.fill(Color.red),代码就能正常工作。


struct ContentView: View {
    @ObservedObject var cntrl:Controller=Controller()
    var body: some View {
        VStack {
            subviewone(cntrl: cntrl)
            graph(cntrl: cntrl)
            subviewone(cntrl: cntrl)
        }.padding(.all)
    }
}

感谢您的任何建议。 Libor
2个回答

0

试试这个 - 已经在13.4上测试过了

struct ContentView: View {

    @EnvironmentObject var controller : Controller

    var body: some View {
        VStack {
            subviewone()
                .environmentObject(controller)
            graph(radius: controller.test)
                .stroke()
                .fill(Color.red)
            subviewone()
            .environmentObject(controller)
        }.padding(.all)
    }
}

struct ContentView_Previews: PreviewProvider {
    static var previews: some View {
        ContentView()
        .environmentObject(Controller())
    }
}

struct graph: Shape {

    @State var radius : CGFloat

    func path(in rect: CGRect) -> Path {
        print("function beeing called")
        return Path { path in
            path.addArc(center: CGPoint(x: rect.midX, y: rect.midY), radius: CGFloat(100-radius), startAngle: Angle.init(degrees: 0), endAngle: Angle.init(degrees: 360), clockwise: true)
        }
    }


}

struct subviewone: View {
    @EnvironmentObject var controller : Controller
    var body: some View {
        VStack {
            Text("******")
            Text("\(controller.test)")
            Text("******")

        }

    }
}

class Controller:ObservableObject {

    @Published var test : CGFloat = 0

    init() {
        _ = Timer.scheduledTimer(withTimeInterval: 1.0, repeats: true) {_ in
            self.test+=1
        }
    }

}

再次感谢Chris。我不得不将第一个“@EnvironmentObject var controller:Controller”更改为“@ObservedObject var controller=Controller()”,然后它就起作用了。你明白为什么我的版本不起作用吗?当我删除.stroke()和.fill(Color.red)时,Shape对象开始按预期重新绘制,代码也可以工作。只是我得到了填充的圆形,而不仅仅是边框。 - matyasl

0
在 Shape 上,你不能同时调用 strokefill,因为第一次调用 strokefill 会返回一个 View,而不是一个 Shape。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接