実現したいこと
swiftuiでPDFKitのPDFPageOverlayViewProviderを利用し、PDF上にPKCanvasViewをセットしています。
canvasに利用するペンや消しゴムを作るため、
swift
1canvasView.tool = PKInkingTool(.pen, width: 20)
の部分を変更したいのですが、うまくいきません。
どなたかお力をお貸しください。お願いします。
以下が全体のコードです。
swift
1import SwiftUI 2import PencilKit 3import PDFKit 4 5struct SwiftUIView: View { 6 7 var body: some View { 8 VStack { 9 HStack{ 10 Button(action: { 11 //ここがわからない 12 }, label: { 13 Text("ペン") 14 }) 15 Button(action: { 16 //ここがわからない 17 }, label: { 18 Text("消しゴム") 19 }) 20 21 } 22 PdfView() 23 } 24 } 25} 26 27struct PdfView : UIViewRepresentable { 28 typealias UIViewType = PDFView 29 30 let overlayProvider = OverlayCoordinator() 31 func makeUIView(context: Context) -> PDFView { 32 let pdfView: PDFView = PDFView() 33 if let url = Bundle.main.url(forResource: "example", withExtension: "pdf") { 34 pdfView.pageOverlayViewProvider = overlayProvider 35 pdfView.document = PDFDocument(url: url) 36 pdfView.autoScales = true 37 pdfView.isInMarkupMode = true 38 } 39 return pdfView 40 } 41 func updateUIView(_ uiView: PDFView, context: Context) { 42 } 43} 44 45class OverlayCoordinator : NSObject,PDFPageOverlayViewProvider { 46 func pdfView(_ view: PDFView, overlayViewFor page: PDFPage) -> UIView? { 47 let canvasView = PKCanvasView() 48 canvasView.drawingPolicy = .anyInput 49 canvasView.tool = PKInkingTool(.pen, width: 1) //ここがtoolを定義しているところ 50 canvasView.backgroundColor = .clear 51 return canvasView 52 } 53} 54#Preview { 55 SwiftUIView() 56}
発生している問題・分からないこと
ボタンを押すことでPKToolを変更したい。
@publishedや@bindingで値を渡すことを考えたが、classではできなかった。
該当のソースコード
swiftui
1特になし
試したこと・調べたこと
- teratailやGoogle等で検索した
- ソースコードを自分なりに変更した
- 知人に聞いた
- その他
上記の詳細・結果
PDFPageOverlayViewProviderで検索すると、この位置にtoolを定義しているものしか見当たりませんでした。WWDC22を参照しているものが多いからだと思います。
(WWDC22 PDFKitの新機能)
PKToolPickerをこの位置に入力すると、ペンや消しゴムが使えるようにはなりますが、toolの表示・非表示がうまくいかなくなる問題が発生したことと、余計なツールが多かったので、今回は見送っています。
pdfViewのoverlayProviderにtoolを上書きしても、変更されませんでした。
補足
yametaiさんからいただいたコードの追記
swift
1import SwiftUI 2import PencilKit 3import PDFKit 4 5struct SwiftUIView: View { 6 @State private var isPen = true 7 var body: some View { 8 VStack { 9 HStack{ 10 Button(action: { 11 isPen = true 12 }, label: { 13 Text("ペン") 14 }) 15 Button(action: { 16 isPen = false 17 }, label: { 18 Text("消しゴム") 19 }) 20 21 } 22 PdfView(isPen: $isPen) 23 } 24 } 25} 26 27struct PdfView : UIViewRepresentable { 28 typealias UIViewType = PDFView 29 @Binding var isPen: Bool 30 let overlayProvider = OverlayCoordinator() 31 func makeUIView(context: Context) -> PDFView { 32 let pdfView: PDFView = PDFView() 33 if let url = Bundle.main.url(forResource: "example", withExtension: "pdf") { 34 pdfView.pageOverlayViewProvider = overlayProvider 35 pdfView.document = PDFDocument(url: url) 36 pdfView.autoScales = true 37 pdfView.isInMarkupMode = true 38 } 39 return pdfView 40 } 41 func updateUIView(_ uiView: PDFView, context: Context) { 42 43 if isPen { 44 print("pen") 45 overlayProvider.setPen() 46 } else { 47 print("eraser") 48 overlayProvider.setEraser() 49 } 50 51 } 52} 53 54class OverlayCoordinator : NSObject,PDFPageOverlayViewProvider { 55 var pageToViewMapping = [PDFPage: PKCanvasView]() //補足追加 56 var canvasView: PKCanvasView = PKCanvasView() 57 58 func pdfView(_ view: PDFView, overlayViewFor page: PDFPage) -> UIView? { 59// let canvasView = PKCanvasView() 60 var resultView:PKCanvasView? = nil 61 // 編集・追加↓ 62 if let overlayView = pageToViewMapping[page] { 63 resultView = overlayView 64 } else { 65 let canvasView = PKCanvasView() 66 canvasView.drawingPolicy = .anyInput 67 canvasView.tool = PKInkingTool(.pen, width: 20) 68 canvasView.backgroundColor = .clear 69 pageToViewMapping[page] = canvasView 70 resultView = canvasView 71 } 72 return resultView 73 // 編集・追加↑ 74 } 75 func setPen() { 76 canvasView.tool = PKInkingTool(.pen, width: 1) 77 } 78 func setEraser() { 79 canvasView.tool = PKEraserTool(.bitmap) 80 } 81 82}
環境 macOS Ventura 13.6.6
xcode Version 15.2
回答1件
あなたの回答
tips
プレビュー