You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

iOS中如何解决捏合放大PDF时PKCanvas覆盖层模糊问题

PDF叠加PKCanvas放大后模糊的问题

我按照WWDC2021提供的方案实现了在每个PDF页面上叠加PKCanvas对象的功能。应用启动时,PDF及叠加的PKCanvas显示均正常,但捏合放大PDF时,PKCanvas会出现像素化、模糊的情况。

放大后带有像素化笔触的PDF

覆盖层创建代码

class MyPDFPage : PDFPage {
    var drawing: PKDrawing?
}

extension ReaderView {
    class Coordinator: NSObject, PDFPageOverlayViewProvider, PDFViewDelegate {
        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()
                
                canvasView.backgroundColor = .clear
                canvasView.drawingPolicy = .pencilOnly
                
                canvasView.tool = PKInkingTool(.pen, color: .black, width: 1)
                
                resultView = canvasView
                
                pageToViewMapping[page] = resultView
            }
            
            if let page = page as? MyPDFPage, let drawing = page.drawing {
                resultView?.drawing = drawing
            }
                        
            return resultView
        }
    }
}

PDF视图创建代码

struct ReaderView: UIViewRepresentable {
    
    public typealias UIViewType = PDFView
    let url: URL
    let document: PDFDocument
    let pdfView = PDFView()
    
    init(_ url: URL) {
        self.url = url
        self.document = PDFDocument(url: self.url)!
    }
    
    func makeCoordinator() -> Coordinator {
        Coordinator()
    }
    
    func makeUIView(context: Context) -> PDFView {
        pdfView.displayDirection = .vertical
        pdfView.isInMarkupMode = true
        pdfView.pageOverlayViewProvider = context.coordinator
        pdfView.displayMode = .singlePageContinuous
        pdfView.usePageViewController(false)
        pdfView.backgroundColor = .clear
        pdfView.delegate = context.coordinator
        
        pdfView.document = document
        return pdfView
    }
    
    func updateUIView(_ uiView: PDFView, context: Context) {
        print(pdfView.scaleFactor)
    }
}

我曾尝试设置canvasView.maximumZoomScale = 10,该操作能实现绘图放大,但底层PDF不再响应捏合输入,覆盖层会自行缩放,锚点位于页面左上角。

设置maximumZoomScale为10仅能放大PKCanvas,PDF无响应

内容的提问来源于stack exchange,提问作者Matthias Schedel

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.20 04:45:17