pdfView 捏合缩小

pdfView pinch zooming out

我正在尝试将使用 webview 显示一些 pdf 的项目移动到 pdfView 以利用最新的 PDFKit 功能。

在 Web 视图中,捏合以缩小文档时始终缩放以填满屏幕。基本上你无法缩小它弹回以填满屏幕的页面。

现在有了 pdfView,我可以通过捏合来缩小它看起来一点也不好没有必要让 pdf 页面比屏幕小...

手指从屏幕上松开后,有什么方法可以激活自动缩放。我知道有手势功能,但我不熟悉它的用法。

回答我自己的问题,其实很简单...

pdfView.autoScales = true 
pdfView.maxScaleFactor = 4.0 
pdfView.minScaleFactor = pdfView.scaleFactorForSizeToFit

此解决方案将在您设置文档 属性 后自动调整 PDFView。只需使用 NoZoomOutPDFView 而不是 PDFView 作为显示 PDFDocument.

的视图
import Foundation
import PDFKit

final class NoZoomOutPDFView: PDFView {

    init() {
        super.init(frame: .zero)
        NotificationCenter
            .default
            .addObserver(
                self,
                selector: #selector(update),
                name: .PDFViewDocumentChanged,
                object: nil
            )
    }

    deinit {
        // If your app targets iOS 9.0 and later the following line can be omitted
        NotificationCenter.default.removeObserver(self)
    }

    required init?(coder aDecoder: NSCoder) {
        fatalError("init(coder:) has not been implemented")
    }

    @objc private func update() {
        // PDF can be zoomed in but not zoomed out
        DispatchQueue.main.async {
            self.autoScales = true
            self.maxScaleFactor = 4.0
            self.minScaleFactor = self.scaleFactorForSizeToFit
        }
    }
}

只是为了确认接受的答案是正确的,同时也为了突出需要使用代码的地方(如答案作者的评论中所述)。即代码必须在设置 pdf 文档后使用:

pdfView.document = pdfDocument
pdfView.autoScales = true
pdfView.maxScaleFactor = 4.0
pdfView.minScaleFactor = pdfView.scaleFactorForSizeToFit 

如果重写PDFView的方法受限,可以通过添加观察者来完成;

NotificationCenter.default.addObserver(self, selector: #selector(scaleChanged), name: NSNotification.Name.PDFViewScaleChanged, object: nil)

并像这样使用它:

@objc func scaleChanged() {
    self.pdfView.maxScaleFactor = 3.0
    self.pdfView.minScaleFactor = self.pdfView.scaleFactorForSizeToFit
}

我遇到了同样的问题,接受的答案对我不起作用。 scaleFactorForSizeToFit 始终返回 0.0,因此我仍然能够缩小直到什么都看不见为止。我不知道这是否特定于我的应用程序或 iOS 中发生的某些更改,但我必须在设置比例因子之前触发 PDFView 上的布局更新。这就是我在 iOS15:

上的工作方式
   if let document = PDFDocument(url: URL(string: "https://www.adobe.com/pdf/pdfs/ISO32000-1PublicPatentLicense.pdf")!) {
        pdfView.displayDirection = .vertical
        pdfView.autoScales = true
        pdfView.document = document
        pdfView.setNeedsLayout()
        pdfView.layoutIfNeeded()
        pdfView.minScaleFactor = pdfView.scaleFactorForSizeToFit
        pdfView.maxScaleFactor = 4.0
    }