如何在不使用PKToolPicker的情况下使用PKCanvasView功能?
解决隐藏PKToolPicker同时使用PKCanvasView的问题
问题核心是:PKCanvasView并不依赖PKToolPicker才能工作,只要为它设置好绘图工具并确保它成为第一响应者,就能正常绘制。你之前的代码中强制关联了PKToolPicker,反而导致隐藏picker时影响了画布的正常功能。
修改后的代码如下:
struct DrawingView: View { private var canvasView = PKCanvasView() var body: some View { MyCanvas(canvasView: canvasView) } } struct MyCanvas: UIViewRepresentable { var canvasView: PKCanvasView func makeUIView(context: Context) -> PKCanvasView { // 设置初始绘图工具 canvasView.tool = PKInkingTool(.marker, color: .black, width: 1) // 确保画布成为第一响应者,才能接收触摸绘制事件 canvasView.becomeFirstResponder() return canvasView } func updateUIView(_ uiView: PKCanvasView, context: Context) { // 每次视图更新时,重新确保第一响应者状态(避免SwiftUI视图刷新后丢失响应权) DispatchQueue.main.async { uiView.becomeFirstResponder() } } }
关键修改点说明
- 完全移除了
PKToolPicker的相关代码,不再创建picker实例、添加观察者或设置可见性 - 保留了初始绘图工具的设置,确保画布有可用的绘制工具
- 在
makeUIView和updateUIView中都确保PKCanvasView成为第一响应者,这是画布能接收触摸事件的必要条件
如果之后需要自定义工具栏(而非系统的PKToolPicker),可以自己实现UI组件来切换canvasView.tool的值,比如切换画笔颜色、粗细或工具类型,完全不需要依赖系统的PKToolPicker。
内容的提问来源于stack exchange,提问作者Ramis
相关产品推荐
相关产品推荐

