Форма не перерисовывает себя - PullRequest
1 голос
/ 02 апреля 2020

Как мне перерисовать Shape с новыми данными, когда эти данные являются новым «источником правды»? Ниже показано, что только представление "Текст (" ... ") обновляется с помощью ObservedObject. Сам Shape dr aws только один раз.

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

1 Ответ

0 голосов
/ 02 апреля 2020

попробуйте - протестировано с 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
        }
    }

}
...