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