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

SwiftUI封装PKCanvasView后绘制内容无法保留问题求助

问题原因

你遇到的笔触松开后消失的问题,核心是没有持久化PKCanvasView的绘图状态。SwiftUI的UIViewRepresentable是值类型,当视图发生任何刷新(比如父视图状态变化、布局调整)时,若没有保存绘图内容,新生成的PKCanvasView会回到初始空白状态,导致之前的笔触丢失。

解决步骤

需要通过状态变量维护绘图内容,并通过代理监听绘图变化,确保SwiftUI视图与PKCanvasView的绘图状态同步:

  • 添加状态变量存储PKDrawing,用于持久化绘图内容
  • 实现PKCanvasViewDelegate监听绘图变化,更新状态变量
  • 在视图更新时同步状态变量与PKCanvasView的绘图内容
修改后的完整代码
import SwiftUI
import PencilKit

struct ContentView: View {
    var body: some View {
        CanvasView()
    }
}

struct CanvasView: UIViewRepresentable {
    // 用@State持久化绘图内容
    @State private var drawing = PKDrawing()
    
    // 创建协调器作为PKCanvasView的代理
    class Coordinator: NSObject, PKCanvasViewDelegate {
        var parent: CanvasView
        
        init(parent: CanvasView) {
            self.parent = parent
        }
        
        // 监听绘图变化,更新父视图的状态变量
        func canvasViewDrawingDidChange(_ canvasView: PKCanvasView) {
            parent.drawing = canvasView.drawing
        }
    }
    
    func makeCoordinator() -> Coordinator {
        Coordinator(parent: self)
    }
    
    func makeUIView(context: Context) -> PKCanvasView {
        let canvas = PKCanvasView()
        canvas.tool = PKInkingTool(.pen, color: .green, width: 10)
        canvas.drawingPolicy = .anyInput
        // 设置初始绘图内容
        canvas.drawing = drawing
        // 设置代理
        canvas.delegate = context.coordinator
        return canvas
    }
    
    func updateUIView(_ uiView: PKCanvasView, context: Context) {
        // 同步状态变量与CanvasView的绘图内容,避免视图刷新时丢失
        if uiView.drawing != drawing {
            uiView.drawing = drawing
        }
    }
}
关键说明
  • @State private var drawing:负责在SwiftUI视图生命周期中保存绘图内容,避免刷新时丢失
  • Coordinator:作为PKCanvasViewDelegate,实时捕获绘图变化并更新状态变量
  • updateUIView中的同步逻辑:确保当状态变量变化时(比如从外部传入新的绘图),PKCanvasView能同步显示最新内容

内容的提问来源于stack exchange,提问作者test1229

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.07 20:55:25