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.
}
}
どんなガイダンスでも大歓迎です!