Pencilkitでpdfに描画
解決したいこと
Swiftuiでpdfを表示させ、表示したpdfにpencilkitを用いて、手書きで描画するアプリを作っています。
pdfを表示させる前は、pencilkitの機能は正常に作動し、機能の切り替え(ペンの色の変更や消しゴム機能への変更など)も問題なくできるのですが、pdfを表示後に描画を行うと機能の切り替えが正常に認知しなくなります。
解決方法を教えて下さい。
発生している問題・エラー
上記画像のように、pdfを表示させる前に選択していた、赤色のペンから変更ができません。マーカーや消しゴムを選んでも、赤色のペンが表示される状態です。
該当するソースコード
import SwiftUI
import PDFKit
import PencilKit
import UniformTypeIdentifiers
struct PDFViewContainer: UIViewRepresentable {
@Binding var pdfDocument: PDFDocument?
func makeUIView(context: Context) -> PDFView {
let pdfView = PDFView()
//pdfの拡大率を調整
pdfView.autoScales = true
//表示モード
pdfView.displayMode = .singlePage
return pdfView
}
func updateUIView(_ uiView: PDFView, context: Context) {
uiView.document = pdfDocument
}
}
struct PKCanvasViewRepresentable: UIViewRepresentable {
@Binding var drawing: PKDrawing
@Binding var selectedTool: PKTool
@Binding var toolPickerVisible: Bool
var pkcView: PKCanvasView
//let pkcView = PKCanvasView()
typealias UIViewType = PKCanvasView
let toolPicker = PKToolPicker()
func makeUIView(context: Context) -> PKCanvasView {
configureCanvasView(pkcView)
return pkcView
}
func updateUIView(_ uiView: PKCanvasView, context: Context) {
//uiView.drawing = drawing
//configureCanvasView(uiView)
}
func configureCanvasView(_ canvasView: PKCanvasView) {
canvasView.drawingPolicy = PKCanvasViewDrawingPolicy.anyInput
//canvasView.tool = selectedTool
toolPicker.addObserver(canvasView) //変化を検知
toolPicker.setVisible(true, forFirstResponder: canvasView) //表示
canvasView.becomeFirstResponder() //変化を適応させる
if !toolPickerVisible {
// ツールピッカーが非表示の場合、手書き内容を設定
canvasView.becomeFirstResponder()
}
canvasView.isOpaque = false
}
}
struct ContentView: View {
@State private var pdfDocument: PDFDocument?
@State private var isDocumentPickerPresented = false
@State private var drawing = PKDrawing()
@State private var toolPickerVisible = false
@State private var selectedTool: PKTool = PKInkingTool(.pen, color: .red, width: 5)
@State private var canvasView = PKCanvasView()
var body: some View {
ZStack {
// PDFViewを追加
PDFViewContainer(pdfDocument: $pdfDocument)
.frame(maxWidth: .infinity, maxHeight: .infinity)
// PKCanvasViewを重ねて描画する
PKCanvasViewRepresentable(drawing: $drawing, selectedTool: $selectedTool, toolPickerVisible: $toolPickerVisible, pkcView: canvasView)
}
VStack {
Button("PDFファイルを選択") {
isDocumentPickerPresented = true
}
.padding()
}
.fileImporter(
isPresented: $isDocumentPickerPresented,
allowedContentTypes: [UTType.pdf],
onCompletion: { result in
switch result {
case .success(let url):
//ファイルへのアクセス許可
guard url.startAccessingSecurityScopedResource() else {
// Handle the failure here.
print("startAccessingSecurityScopedResource error")
return
}
// FileManagerを使用してファイルが存在するか確認
let fileManager = FileManager.default
if fileManager.fileExists(atPath: url.path) {
print("ファイルが存在します: \(url.path)")
} else {
print("ファイルが存在しません: \(url.path)")
}
// PDFDocumentの作成
if let document = PDFDocument(url: url) {
print("PDFドキュメントが正常に読み込まれました")
self.pdfDocument = document
} else {
let error = NSError(domain: "com.example.PDFApp", code: 1, userInfo: [NSLocalizedDescriptionKey: "PDFドキュメントの読み込みに失敗しました"])
print("エラー: \(error.localizedDescription), \(error.localizedFailureReason ?? "")")
}
url.stopAccessingSecurityScopedResource()
case .failure(let error):
print("ファイル選択時にエラーが発生しました:\(error.localizedDescription)")
}
}
)
}
}
自分で試したこと
PKCanvasViewRepresentableにおける、updateUIViewにmakeUIViewと同様の処理を追加しましたが、ペンや消しゴムを選択するパレットが消えてしまう不具合が起こりました。