PDFPageOverlayProvider Coordinator 的方法永远不会在 PDFKit、SwiftUI 中被调用

问题描述 投票:0回答:1

我正在尝试将铅笔套件集成到 SwiftUI 中的 PDFKit 视图上,但协调器委托方法永远不会触发。我在这里做错了什么?

`导入 SwiftUI 导入PDFKit 导入铅笔套件

结构 PDFDocumentView: 查看 { var url: 网址?

var body: some View {
    if let pdfURL = url {
        let pdfDocument = PDFDocument(url: pdfURL)
        if let pdf = pdfDocument {
            PDFViewWrapper(pdfDocument: pdf)
                .frame(maxWidth: .infinity, maxHeight: .infinity)
                .edgesIgnoringSafeArea(.all)
        }
    }
}

}

结构 PDFViewWrapper:UIViewControllerRepresentable {

var pdfDocument: PDFDocument
var coordinator: OverlayCoordinator = OverlayCoordinator()

func makeUIViewController(context: UIViewControllerRepresentableContext<PDFViewWrapper>) -> some UIViewController {
    let pdfView  = PDFView()
    pdfView.document = pdfDocument
    pdfView.pageOverlayViewProvider = coordinator
    pdfView.delegate = coordinator
    pdfView.isInMarkupMode = true
    
    let viewController = UIViewController()
    viewController.view.addSubview(pdfView)
    pdfView.translatesAutoresizingMaskIntoConstraints = false
    NSLayoutConstraint.activate([pdfView.leadingAnchor.constraint(equalTo: viewController.view.leadingAnchor),
                                 pdfView.trailingAnchor.constraint(equalTo: viewController.view.trailingAnchor),
                                 pdfView.bottomAnchor.constraint(equalTo: viewController.view.bottomAnchor),
                                 pdfView.topAnchor.constraint(equalTo: viewController.view.topAnchor)])
    return viewController
}



func updateUIViewController(_ uiViewController: UIViewControllerType, context: UIViewControllerRepresentableContext<PDFViewWrapper>) {}

}`

`类 OverlayCoordinator : NSObject、PDFPageOverlayViewProvider 、PDFViewDelegate {

var pageToViewMapping = [PDFPage: PKCanvasView]() // Change UIView to PKCanvasView

func pdfView(_ pdfView: PDFView, willDisplayOverlayView overlayView: UIView, for page: PDFPage) {
    print("here")
}
func pdfView(_ view: PDFView, overlayViewFor page: PDFPage) -> UIView? {
    print("Setup Overlay View ")
    if let canvasView = pageToViewMapping[page] {
        return canvasView
    } else {
        let canvasView = PKCanvasView(frame: .zero)
        canvasView.backgroundColor = UIColor.clear
        canvasView.drawingPolicy = .anyInput
        canvasView.tool = PKInkingTool(ink: .init(.pen), width: 90)
        canvasView.isOpaque = false
        pageToViewMapping[page] = canvasView
        return canvasView
    }
}

}

#预览{ PDF文档视图() }`

swift swiftui uikit
1个回答
0
投票

好吧,我自己找到了解决办法。好像是这个设定

`pdfView.pageOverlayViewProvider = coordinator` should be done before 

pdfView.document = pdfDocument

很奇怪但是还好

© www.soinside.com 2019 - 2024. All rights reserved.