在 iOS 上使用 QLPreviewController 查看 pdf 文档

因为在项目中有该需求,所以今天花了点时间研究了下。在 iOS 上查看 pdf 文档的方式有不少,如 UIWebView、QLPreviewController、UIPageViewController、UIDocumentInteractionController 以及 iOS11 专门推出的 PDFKit,当然还有一些强大的第三方库例如 BookReader,网上有很多资料有兴趣可以自己去尝试。个人认为最简单的是万能的 UIWebView,几句代码即可:

// 本地
//let url = URL(fileURLWithPath: Bundle.main.path(forResource: "123", ofType: "pdf")!)
// 网络
let url = URL(string: "pdf link")
let request = URLRequest(url: url!)
webview.scalesPageToFit = true
webview.loadRequest(request)

但由于我想使用系统自带的分享以及打印功能,因此我选用 QLPreviewController 来完成。使用起来也是很方便:

override func viewDidLoad() {
        super.viewDidLoad()
        previewController = QLPreviewController()
        previewController.view.frame = self.view.bounds
        previewController.dataSource = self
        previewController.delegate = self
        self.present(previewController, animated: true, completion: nil)
}

func numberOfPreviewItems(in controller: QLPreviewController) -> Int {
        return 1
    }

func previewController(_ controller: QLPreviewController, previewItemAt index: Int) -> QLPreviewItem {
        let url = URL(fileURLWithPath: (SANDBOX_DOCUMENTS_DIR as NSString).appendingPathComponent("123.pdf"))
        return url as QLPreviewItem
    }

func previewControllerWillDismiss(_ controller: QLPreviewController) {
        print("将要关闭之前调用")
    }
    
    func previewControllerDidDismiss(_ controller: QLPreviewController) {
        print("关闭之后调用")
    }

要注意的是,我测试时发现若加载 Bundle.main 文件,文件将不会显示,同时控制台会提示:Couldn't issue file extension for url。不知这个是不是系统 bug,我的测试环境是 iOS11.2、Xcode9.2、Swift4.0。因此,需要先将文件 copy 到沙盒。

但若不想使用 QLPreviewController 自带的工具栏(例如不想文档被分享),稍微修改代码即可:

override func viewDidLoad() {
        super.viewDidLoad()
        previewController = QLPreviewController()
        previewController.view.frame = self.view.bounds
        previewController.dataSource = self
        previewController.delegate = self
        self.addChildViewController(previewController)
        self.view.addSubview(previewController.view)
}

参考链接

你可能感兴趣的:(在 iOS 上使用 QLPreviewController 查看 pdf 文档)