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
相关产品推荐
相关产品推荐

