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

SwiftUI中PKCanvasView叠加PDFView缩放后画质模糊问题求助

SwiftUI中PDFView叠加PKCanvasView放大后绘图模糊问题

我正在开发一款SwiftUI应用,使用PDFPageOverlayViewProvider将PKCanvasView叠加到PDFView的每一页上。初始缩放比例下运行正常,但放大PDF后,PKCanvasView上的绘图会变得模糊或像素化,而PDF本身依然清晰。

我尝试通过调整canvasView.contentScaleFactor与pdfView.scaleFactor的相对值来保持绘图质量,以下是相关代码的简化版本:

import SwiftUI
import PDFKit
import PencilKit
 
struct ContentView: View {
    var body: some View {
        if let url = Bundle.main.url(forResource: "sample", withExtension: "pdf"),
           let data = try? Data(contentsOf: url),
           let document = PDFDocument(data: data) {
            PDFRepresentableView(document: document)
        } else {
            Text("")
        }
    }
}
 
#Preview {
    ContentView()
}
 
struct PDFRepresentableView: UIViewRepresentable {
    let document: PDFDocument
    let pdfView = PDFView()
    
    func makeUIView(context: Context) -> PDFView {
        pdfView.displayMode = .singlePageContinuous
        pdfView.usePageViewController(false)
        pdfView.displayDirection = .vertical
        
        pdfView.pageOverlayViewProvider = context.coordinator
        
        pdfView.document = document
        pdfView.autoScales = false
        pdfView.minScaleFactor = 0.7
        pdfView.maxScaleFactor = 4
        
        
        NotificationCenter.default.addObserver(
            context.coordinator,
            selector: #selector(context.coordinator.onPageZoomAndPan),
            name: .PDFViewScaleChanged,
            object: pdfView
        )
        
        return pdfView
    }
 
    func updateUIView(_ uiView: PDFView, context: Context) {
        // Optional: update logic if needed
    }
 
    func makeCoordinator() -> CustomCoordinator {
        return CustomCoordinator(parent: self)
    }
}
 

class CustomCoordinator: NSObject, PDFPageOverlayViewProvider, PKCanvasViewDelegate {
    let parent: PDFRepresentableView
    
    init(parent: PDFRepresentableView) {
        self.parent = parent
    }
    
    func pdfView(_ view: PDFView, overlayViewFor page: PDFPage) -> UIView? {
        let canvasView = PKCanvasView()
        let rect = page.bounds(for: .mediaBox)
 
        canvasView.drawingPolicy = .anyInput
        canvasView.tool = PKInkingTool(.pen, color: .black, width: 10)
        canvasView.translatesAutoresizingMaskIntoConstraints = true
        canvasView.backgroundColor = .red.withAlphaComponent(0.1)
        canvasView.frame = rect
        canvasView.isScrollEnabled = false
        
        for subView in view.documentView?.subviews ?? [] {
            subView.isUserInteractionEnabled = true
        }
        
        return canvasView
    }
    
    @objc func onPageZoomAndPan() {
        parent.pdfView.documentView?.subviews.forEach { subview in
            if
                subview.theClassName == "PDFPageView",
                let pageViewPrivate = subview.value(forKey: "_private") as? NSObject,
                let page = pageViewPrivate.value(forKey: "page") as? PDFPage {
             
                subview.subviews.forEach { subview in
                    if let canvasView = subview as? PKCanvasView {
                        let zoomScale = parent.pdfView.scaleFactor
                        
                        canvasView.contentScaleFactor = UIScreen.main.scale * zoomScale
                        canvasView.drawing = canvasView.drawing
                        
                        canvasView.setNeedsDisplay()
                        canvasView.layoutIfNeeded()
                    }
                }
            }
        }
 
        print("Zoom changed. Current scale: \(parent.pdfView.scaleFactor)")
    }
}
 
extension NSObject {
    var theClassName: String {
        return NSStringFromClass(type(of: self))
    }
}

但这似乎没有改善渲染质量,放大时线条仍然模糊。

我已尝试的方法:

  • 调整contentScaleFactor并强制重绘
  • 重新赋值canvasView.drawing
  • 调用setNeedsDisplay()和layoutIfNeeded()

这些方法都无法让画布以更高分辨率重新渲染,也无法匹配PDF的缩放比例。

我的疑问:

  1. 是否有正确的方法让PKCanvasView内容缩放匹配PDF的缩放级别?
  2. 缩放变化时是否需要重新创建画布或绘图?
  3. PKCanvasView是否本就不支持高缩放保真度?

如果有人成功在可缩放的PDFView上叠加高分辨率画布绘图,希望能分享实现方法。

即使修改了比例并重新赋值绘图,我仍无法获得绘图的矢量渲染效果。


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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.12 16:57:35