Swiftui 形状不会重新绘制自身
当这些数据是新的“真相来源”时,我如何用新数据重新绘制形状? 下面显示的是,只有“文本(“…”)视图使用ObservedObject更新。形状只绘制一次自身Swiftui 形状不会重新绘制自身,swiftui,shapes,redraw,Swiftui,Shapes,Redraw,当这些数据是新的“真相来源”时,我如何用新数据重新绘制形状? 下面显示的是,只有“文本(“…”)视图使用ObservedObject更新。形状只绘制一次自身 import SwiftUI struct ContentView: View { @ObservedObject var cntrl:Controller=Controller() var body: some View { VStack { subviewone(cntrl: c
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),代码就可以工作
谢谢你的建议。
伦敦银行同业拆借利率(Libor)试试这个——用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
}
}
}
关于形状,你永远不能一次调用
stroke
和fill
,因为第一次调用stroke
或fill
返回一个视图,不再是形状。再次感谢你,克里斯。我不得不将第一个“@EnvironmentObject var controller:controller”更改为“@ObservedObject var controller=controller()“然后它成功了。你明白为什么我的版本不起作用吗?当我删除.stroke()和.fill(Color.red)时,形状对象开始按预期重新绘制,代码正常工作。只是我得到了一个圆,而不仅仅是边界。
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
}
}
}