You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在不使用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.19 02:10:36