PKCanvas神秘归还原图,如何?

问题描述 投票:0回答:0

MRE

我花了很多时间试图弄清楚发生了什么,但我无法弄清楚

struct ContentView: View {
    @State private var canvasView = PKCanvasView()
    @State private var rendition = PKDrawing()

    func save() {
        rendition = canvasView.drawing
    }
    func load() {
        canvasView.drawing = rendition
    }
    func delete() {
        canvasView.drawing = PKDrawing()
    }
    var body: some View {
        VStack {
            Button {
                save()
            } label: {
                Text("Save")
            }
            Button {
                load()
            } label: {
                Text("load")
            }
            Button {
                delete()
            } label: {
                Text("delete")
            }
            CanvasView(canvasView: $canvasView)
        }
    }
}
  1. 当我点击保存时,草图被保存到内存中。
  2. 那我继续素描
  3. 然后我按加载加载以前保存的 PKDrawing
  4. 然后我继续画,突然又回到了(2)画的样子

怎么回事?

struct CanvasView {
  @Binding var canvasView: PKCanvasView
  @State var toolPicker = PKToolPicker()
}

// MARK: - UIViewRepresentable
extension CanvasView: UIViewRepresentable {
  func makeUIView(context: Context) -> PKCanvasView {
    canvasView.tool = PKInkingTool(.pen, color: .gray, width: 10)
    #if targetEnvironment(simulator)
      canvasView.drawingPolicy = .anyInput
    #endif
    canvasView.delegate = context.coordinator
    showToolPicker()
    return canvasView
  }

  func updateUIView(_ uiView: PKCanvasView, context: Context) {}

  func makeCoordinator() -> Coordinator {
    Coordinator(canvasView: $canvasView)
  }
}

// MARK: - Private Methods
private extension CanvasView {
  func showToolPicker() {
    toolPicker.setVisible(true, forFirstResponder: canvasView)
    toolPicker.addObserver(canvasView)
    canvasView.becomeFirstResponder()
  }
}

// MARK: - Coordinator
class Coordinator: NSObject {
  var canvasView: Binding<PKCanvasView>

  // MARK: - Initializers
  init(canvasView: Binding<PKCanvasView>) {
    self.canvasView = canvasView
  }
}

// MARK: - PKCanvasViewDelegate
extension Coordinator: PKCanvasViewDelegate {
  func canvasViewDrawingDidChange(_ canvasView: PKCanvasView) {
    if !canvasView.drawing.bounds.isEmpty {
    }
  }
}
uiview uikit pencilkit pkcanvasview
© www.soinside.com 2019 - 2024. All rights reserved.