我有一个
DrawingView
,它显示在 SwiftUI 中的 .sheet
内:
...
.sheet { DrawingView() }
struct DrawingView: View {
private var canvasView = PKCanvasView()
@Environment(\.dismiss) var dismiss
var body: some View {
NavigationStack {
GeometryReader { proxy in
MyCanvas(canvasView: canvasView)
}
...
该视图托管我的 PKCanvasView:
struct MyCanvas: UIViewRepresentable {
var canvasView: PKCanvasView
@Binding var oldImage: UIImage?
let picker = PKToolPicker()
func makeUIView(context: Context) -> PKCanvasView {
self.canvasView.tool = PKInkingTool(.pen, color: .black, width: 15)
self.canvasView.becomeFirstResponder()
return canvasView
}
func updateUIView(_ uiView: PKCanvasView, context: Context) {
print(#function, uiView.drawing.strokes.count)
picker.addObserver(canvasView)
picker.setVisible(true, forFirstResponder: uiView)
DispatchQueue.main.async {
uiView.becomeFirstResponder()
}
}
}
到目前为止一切顺利,但是当我开始关闭工作表时,PKView 会自动关闭工具。当我将床单向上滑动时,它们就消失了。我仍然可以使用最后选择的笔进行绘画,但仅此而已。我认为这是第一响应者问题? SwiftUI 告诉 PKCanvasView 删除响应程序,因此它会关闭这些工具,对吗? 类似于键盘被关闭:(参见这篇文章)
也许你可以手动使用
canvasView.becomeFirstResponder()
和 canvasView.resignFirstResponder()
来处理它