美文网首页swift
在 iOS 上使用 QLPreviewController 查看

在 iOS 上使用 QLPreviewController 查看

作者: Desmond_ | 来源:发表于2018-04-25 13:06 被阅读416次

    因为在项目中有该需求,所以今天花了点时间研究了下。在 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.delegate, 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 查看

        本文链接:https://www.haomeiwen.com/subject/etnelftx.html