実現したいこと
以前こちらでPDFPageOverlayViewProviderのPKTool変更を解決していただきました。
以前の内容
そのコードを使い、if文を利用してbuttonなどの装飾を行いたいのですが、なぜか出来ません。
何がダメなのかも解らず困っています。
発生している問題・分からないこと
buttonやview内に「if文」を入れると、OverlayCoordinatorクラスのsetPen()やsetEraser()が使えなくなってしまいます。
OverlayCoordinatorクラスのpageToViewMapping配列が「if文」を作成すると消えてしまうようです。
環境
macOS Ventura 13.6.6
xcode Version 15.2
エラーメッセージ
error
1エラーメッセージは出ません。
該当のソースコード
swift
1import SwiftUI 2import PDFKit 3import PencilKit 4 5struct PDFUIView: View { 6 @State private var isPen = true 7 8 var body: some View { 9 VStack { 10 HStack{ 11 Button(action: { 12 isPen = true 13 }, label: { 14 Text("ペン") 15 }) 16 Button(action: { 17 isPen = false 18 }, label: { 19 Text("消しゴム") 20 }) 21 //↓問題のコード 22 if isPen == true{ 23 }else { 24 } 25 //↑問題のコード 26 } 27 pdfView(isPen: $isPen) 28 } 29 } 30} 31 32struct pdfView : UIViewRepresentable { 33 typealias UIViewType = PDFView 34 @Binding var isPen: Bool 35 let overlayProvider = OverlayCoordinator() 36 func makeUIView(context: Context) -> PDFView { 37 let pdfView: PDFView = PDFView() 38 if let url = Bundle.main.url(forResource: "example", withExtension: "pdf") { 39 pdfView.pageOverlayViewProvider = overlayProvider 40 pdfView.document = PDFDocument(url: url) 41 pdfView.autoScales = true 42 pdfView.isInMarkupMode = true 43 } 44 return pdfView 45 } 46 func updateUIView(_ uiView: PDFView, context: Context) { 47 48 if isPen { 49 overlayProvider.setPen() 50 } else { 51 overlayProvider.setEraser() 52 } 53 54 } 55} 56 57class OverlayCoordinator : NSObject,PDFPageOverlayViewProvider { 58 var pageToViewMapping = [PDFPage: PKCanvasView]() 59 60 func pdfView(_ view: PDFView, overlayViewFor page: PDFPage) -> UIView? { 61 var resultView:PKCanvasView? = nil 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: 1) 68 canvasView.backgroundColor = .clear 69 pageToViewMapping[page] = canvasView 70 resultView = canvasView 71 } 72 return resultView 73 74 } 75 func setPen() { 76 for i in pageToViewMapping { 77 i.value.tool = PKInkingTool(.pen, width: 1) 78 } 79 print(pageToViewMapping) //デバッグ用 80 81 } 82 func setEraser() { 83 for i in pageToViewMapping { 84 i.value.tool = PKEraserTool(.bitmap) 85 } 86 print(pageToViewMapping) //デバッグ用 87 } 88 89}
試したこと・調べたこと
- teratailやGoogle等で検索した
- ソースコードを自分なりに変更した
- 知人に聞いた
- その他
上記の詳細・結果
if文を別のところに挿入したり、追加でOverlayCoordinatorとは直接関係のない値を作成しても、「if文」が入ると同様の結果になってしまいました。
swift
1@State private var penMode = true 2 3Button(action: { 4 isPen = true 5 }, label: { 6 if penMode == true{ 7 }else { 8 } 9 })
補足
特になし
回答1件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2024/04/29 06:47