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的缩放比例。
我的疑问:
- 是否有正确的方法让PKCanvasView内容缩放匹配PDF的缩放级别?
- 缩放变化时是否需要重新创建画布或绘图?
- PKCanvasView是否本就不支持高缩放保真度?
如果有人成功在可缩放的PDFView上叠加高分辨率画布绘图,希望能分享实现方法。
即使修改了比例并重新赋值绘图,我仍无法获得绘图的矢量渲染效果。
内容的提问来源于stack exchange,提问作者sol
相关产品推荐
相关产品推荐

