3

PKCanvasViewというSwiftUIビューとしてラップしようとしていますCanvasView。キャンバス全体を別のビューの上に切り替えられるようにしたいと思います。が出る時は もCanvasView出て欲しいPKToolPickerです。消える時は消えてPKToolPicker欲しいです。

ここでいくつかの同様のアプローチを見つけましたが、ピッカーを表示するか、ボタンでピッカーを切り替えるだけです。ピッカーの可視性をビューの可視性に関連付けたいと思います。

以下の例では、キャンバスを切り替えることができますが、ツール ピッカーが表示されると、表示されたままになります。

これが私のものCanvasViewです:

import SwiftUI
import PencilKit

struct CanvasView: UIViewRepresentable {

    class Coordinator: NSObject, PKCanvasViewDelegate {
        var canvasView: Binding<PKCanvasView>
        let onChange: () -> Void

        init(canvasView: Binding<PKCanvasView>, onChange: @escaping () -> Void) {
            self.canvasView = canvasView
            self.onChange = onChange
        }

        func canvasViewDrawingDidChange(_ canvasView: PKCanvasView) {
            if canvasView.drawing.bounds.isEmpty == false {
                onChange()
            }
        }
    }

    @Binding var canvasView: PKCanvasView
    @Binding var toolPickerIsActive: Bool
    private let toolPicker = PKToolPicker()

    let onChange: () -> Void

    func makeUIView(context: Context) -> PKCanvasView {
        canvasView.backgroundColor = .clear
        canvasView.isOpaque = true
        canvasView.delegate = context.coordinator
        showToolPicker()

        return canvasView
    }

    func updateUIView(_ uiView: PKCanvasView, context: Context) {
        toolPicker.setVisible(toolPickerIsActive, forFirstResponder: uiView)
    }

    func showToolPicker() {
      toolPicker.setVisible(true, forFirstResponder: canvasView)
      toolPicker.addObserver(canvasView)
      canvasView.becomeFirstResponder()
    }

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

そして例ContentView

struct ContentView: View {
    @State private var canvasView = PKCanvasView()
    @State private var toolPickerIsActive = false
    @State private var canvasIsVisible = false

    var body: some View {
        ZStack {
            if canvasIsVisible {
                CanvasView(canvasView: $canvasView,
                           toolPickerIsActive: $toolPickerIsActive,
                           onChange: canvasDidChange)
                    .onAppear { toolPickerIsActive = true }
                    .onDisappear { toolPickerIsActive = false }
            }

            Button(action: {
                canvasIsVisible.toggle()
            }, label: {
                Text("Toggle canvas view")
            })
        }
    }

    private func canvasDidChange() {
        // Do something with updated canvas.
    }
}

どんなガイダンスでも大歓迎です!

4

1 に答える 1