The PKCanvasView Created by PDFPageOverlayViewProvider cannot work normally

By setting the PKCanvasView background color to blue, I can tell that the PKCanvasView for each PDFPage is created normally, but it does not respond to touch. Specifically, whether it is finger or applepencil, all the responses of the page occur from PDFView(such as zoom and scroll), and PKCanvasView can not draw, please how to solve?


class PDFAnnotatableViewController: UIViewController, PDFViewDelegate {
    private let pdfView = PDFView()
    private var pdfDocument: PDFDocument?
    
    let file: FileItem
    private var userSettings: UserSettings
    @Binding var selectedPage: Int
    @Binding var currentMode: Mode
    @Binding var latestPdfChatResponse: LatestPDFChatResponse
    @State private var pdfPageCoordinator = PDFPageCoordinator()
    @ObservedObject var userMessage: ChatMessage
    
    init(file: FileItem,
         userSettings: UserSettings,
         drawDataList:  Binding<[DrawDataItem]>,
         selectedPage: Binding<Int>,
         currentMode: Binding<Mode>,
         latestPdfChatResponse: Binding<LatestPDFChatResponse>,
         userMessage: ChatMessage) {
        
        self.file = file
        self.userSettings = userSettings
        self._selectedPage = selectedPage
        self._currentMode = currentMode
        self._latestPdfChatResponse = latestPdfChatResponse
        self.userMessage = userMessage
        super.init(nibName: nil, bundle: nil)
        
        DispatchQueue.global(qos: .userInitiated).async {
            if let document = PDFDocument(url: file.pdfLocalUrl) {
                DispatchQueue.main.async {
                    self.pdfDocument = document
                    self.pdfView.document = document
                    self.goToPage(selectedPage: selectedPage.wrappedValue - 1)
                }
            }
        }
    }
    
    required init?(coder: NSCoder) {
        fatalError("init(coder:) has not been implemented")
    }
    
    override func viewDidLoad() {
        super.viewDidLoad()
        setupPDFView()
    }
    
    private func setupPDFView() {
        pdfView.delegate = self
        pdfView.autoScales = true
        pdfView.displayMode = .singlePage
        pdfView.displayDirection = .vertical
        pdfView.backgroundColor = .white
        pdfView.usePageViewController(true)
        pdfView.displaysPageBreaks = false
        pdfView.displaysAsBook = false
        pdfView.minScaleFactor = 0.8
        pdfView.maxScaleFactor = 3.5
        pdfView.pageOverlayViewProvider = pdfPageCoordinator
        
        if let document = pdfDocument {
            pdfView.document = document
            goToPage(selectedPage: selectedPage)
        }
        
        pdfView.frame = view.bounds
        pdfView.autoresizingMask = [.flexibleWidth, .flexibleHeight]
        view.addSubview(pdfView)
        
        NotificationCenter.default.addObserver(
            self,
            selector: #selector(handlePageChange),
            name: .PDFViewPageChanged,
            object: pdfView
        )
    }

    // Dealing with page turning
    @objc private func handlePageChange(notification: Notification) {
        guard let currentPage = pdfView.currentPage, let document = pdfView.document else { return }
        let currentPageIndex = document.index(for: currentPage)
        
        if currentPageIndex != selectedPage - 1 {
            DispatchQueue.main.async {
                self.selectedPage = currentPageIndex + 1
            }
        }
    }
    

    func goToPage(selectedPage: Int) {
        guard let document = pdfView.document else { return }
        if let page = document.page(at: selectedPage) {
            pdfView.go(to: page)
        }
    }
    
    // Switch function
    func togglecurrentMode(currentMode: Mode){
        DispatchQueue.main.async {
            
            if self.currentMode == .none{
                self.pdfView.usePageViewController(true)
                self.pdfView.isUserInteractionEnabled = true
            } else if self.currentMode == .annotation {
                if let page = self.pdfView.currentPage {
                    if let canvasView = self.pdfPageCoordinator.getCanvasView(forPage: page) {
                        canvasView.isUserInteractionEnabled = true
                        canvasView.tool = PKInkingTool(.pen, color: .red, width: 20)
                        canvasView.drawingPolicy = .anyInput 
                        canvasView.setNeedsDisplay()
                    }
                }
            }
        }
    }
}

class MyPDFPage: PDFPage {
    var drawing: PKDrawing?
    
    func setDrawing(_ drawing: PKDrawing) {
        self.drawing = drawing
    }
    
    func getDrawing() -> PKDrawing? {
        return self.drawing
    }
}

class PDFPageCoordinator: NSObject, PDFPageOverlayViewProvider {
    
    var pageToViewMapping = [PDFPage: PKCanvasView]()
    
    func pdfView(_ view: PDFView, overlayViewFor page: PDFPage) -> UIView? {
        var resultView: PKCanvasView? = nil
        
        if let overlayView = pageToViewMapping[page] {
            resultView = overlayView
        } else {
            let canvasView = PKCanvasView(frame: view.bounds)
            canvasView.drawingPolicy = .anyInput
            canvasView.tool = PKInkingTool(.pen, color: .systemYellow, width: 20)
            canvasView.backgroundColor = .blue
            pageToViewMapping[page] = canvasView
            resultView = canvasView
        }
        
        if let page = page as? MyPDFPage, let drawing = page.drawing {
            resultView?.drawing = drawing
        }
        return resultView
    }
    
    func pdfView(_ pdfView: PDFView, willEndDisplayingOverlayView overlayView: UIView, for page: PDFPage) {
        guard let overlayView = overlayView as? PKCanvasView, let page = page as? MyPDFPage else { return }
        page.drawing = overlayView.drawing
        pageToViewMapping.removeValue(forKey: page)
    }
    
    func savePDFDocument(_ pdfDocument: PDFDocument) -> Data {
        for i in 0..<pdfDocument.pageCount {
            if let page = pdfDocument.page(at: i) as? MyPDFPage, let drawing = page.drawing {
                
                let newAnnotation = PDFAnnotation(bounds: drawing.bounds, forType: .stamp, withProperties: nil)
                let codedData = try! NSKeyedArchiver.archivedData(withRootObject: drawing, requiringSecureCoding: true)
                newAnnotation.setValue(codedData, forAnnotationKey: PDFAnnotationKey(rawValue: "drawingData"))
                page.addAnnotation(newAnnotation)
            }
        }

        let options = [PDFDocumentWriteOption.burnInAnnotationsOption: true]
        if let resultData = pdfDocument.dataRepresentation(options: options) {
            return resultData
        }

        return Data()
    }
    func getCanvasView(forPage page: PDFPage) -> PKCanvasView? {
        return pageToViewMapping[page]
    }
}

Is there an error in my code? Please tell me how to make PKCanvasView painting normally?

The PKCanvasView Created by PDFPageOverlayViewProvider cannot work normally
 
 
Q