SwiftUI-如何从VStack内的函数中的另一个Struct的Coordinator运行代码



我是SwiftUI的新手。我只用了一天。

我有这个:

struct Canvas: UIViewRepresentable {
class Coordinator:NSObject, PKCanvasViewDelegate {
func scrollViewDidZoom(_ scrollView: UIScrollView) {
doSomething(scrollView)
}

func doSomething(_ scrollView: UIScrollView) {
// do something with the scrollView
// change the scrollView size and content area
}
}
func makeUIView(context: Context) -> PKCanvasView {
canvasView.tool = PKInkingTool(.pen, color: .black, width: 15)
canvasView.isOpaque = false
canvasView.backgroundColor = UIColor.clear
canvasView.delegate = context.coordinator
return canvasView
}

在属于结构体CanvasmakeUIView的最后一行之前,我想执行doSomething(scrollView)

问题是canvasView仍在创建中,其边界等于(0,0,0,0),因此doSomething()将失败。

因此,我必须从创建视图的时候起,在.onAppear内部,将其命名为:

struct ContentView: View {
@Environment(.undoManager) var undoManager
@State private var canvasView = PKCanvasView()

var toolBar:Toolbar {
var toolBar = Toolbar()
toolBar.canvasView = canvasView
return toolBar
}
var canvas:Canvas {
return Canvas(canvasView: $canvasView)
}

var body: some View {
VStack(alignment:.center, spacing: 10) {
toolBar
Spacer().frame(height: 1)
Divider()
canvas
}
.onAppear {
// execute doSomething() here
}
}
}

如何?

请回答我,因为我在SwiftUI方面已经5岁了。我的大脑仍在为这些已知的知识而旋转。好吧,让它3岁。

以下是一种可能的方法(在许多情况下对我有效(

func makeUIView(context: Context) -> PKCanvasView {
canvasView.tool = PKInkingTool(.pen, color: .black, width: 15)
canvasView.isOpaque = false
canvasView.backgroundColor = UIColor.clear
canvasView.delegate = context.coordinator

DispatchQueue.main.async {
// in this time created view is already in view hierarchy
// so can be processed somehow
context.coordinator.doSomething(canvasView)  // << try this !!
}
return canvasView
}

最新更新