我是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
}
在属于结构体Canvas
的makeUIView
的最后一行之前,我想执行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
}