在Swift上使用PDFKit创建电子书阅读器

下午好 正如作者所承诺的那样,我将继续向您介绍“在Swift中下载,保存和查看PDF”一文-我们将仔细研究PDFKit。

PDFKit出现在iOS 11中,它具有3个很棒的功能,在创建eBook阅读器应用程序的过程中,我想谈一谈: 分页显示内容和页面图标

每个有兴趣的人,欢迎猫。

图片

图片

图片
分页,大纲和缩略图

使用初始化注入创建PDFViewController

在PDFViewController中创建URL变量时,我们使其变为不可变的。 这就是为什么我选择初始化注入而不是属性注入方法注入的原因

唯一实现的变量是pdfUrl ,其余的: documentoutline可通过本地类的范围访问,并可通过init()初始化

pdfView的内容没有改变,因此我用变量document对其进行了指定,并通过init()对其进行了初始化

import UIKit import PDFKit class PDFViewController: UIViewController { private let pdfUrl: URL private let document: PDFDocument! private let outline: PDFOutline? private var pdfView = PDFView() init(pdfUrl: URL) { self.pdfUrl = pdfUrl self.document = PDFDocument(url: pdfUrl) self.outline = document.outlineRoot pdfView.document = document super.init(nibName: nil, bundle: nil) } ... override func viewDidLoad() { super.viewDidLoad() view.addSubview(pdfView) } } 

 import UIKit class ViewController: UIViewController { @IBAction func openPdfPressed(_ sender: Any) { guard let path = Bundle.main.url(forResource: "swift", withExtension: "pdf") else { print("failed to unwrap fileURL") return } let pdfViewController = PDFViewController(pdfUrl: path) present(pdfViewController, animated: true, completion: nil) } } 

设置水平分页

现在,我们已经在pdfView.document中编写了文档中的内容。 为了像在书本中那样进行水平滚动,您需要向PDFView添加一些设置。

 private func setupPDFView() { view.addSubview(pdfView) pdfView.displayDirection = .horizontal pdfView.usePageViewController(true) pdfView.pageBreakMargins = UIEdgeInsets(top: 0, left: 0, bottom: 0, right: 0) pdfView.autoScales = true } 

图片

页面图标便于导航

PDFKit有一个非常方便的功能,例如ThumbnailView。 您需要做的就是将pdfView分配给thumbnailView.pdfView属性。 仅此而已! 没有代表,通知或其他设置。

 private func setupThumbnailView() { thumbnailView.pdfView = pdfView thumbnailView.backgroundColor = UIColor(displayP3Red: 179/255, green: 179/255, blue: 179/255, alpha: 0.5) thumbnailView.layoutMode = .horizontal thumbnailView.thumbnailSize = CGSize(width: 80, height: 100) thumbnailView.contentInset = UIEdgeInsets(top: 0, left: 10, bottom: 0, right: 10) view.addSubview(thumbnailView) } 

图片

显示章节导航的内容

要进入特定页面,我们需要将特定页面( PDFPage )转移到pdfView 。 因此,我们需要深入研究文档( document )中内容( 大纲 )的层次结构才能到达所需的页面( page )。

图片

我正在使用UITableViewController作为弹出窗口( popOver )。 因此,我需要:

  1. 创建一个协议。 UITableViewController必须遵循此协议。
  2. 添加一些委托方法来访问PDFViewController中的pdfView
  3. 当用户选择特定的单元格时,调用委托方法。

 import UIKit import PDFKit protocol OutlineDelegate: class { func goTo(page: PDFPage) } class OutlineTableViewController: UITableViewController { let outline: PDFOutline weak var delegate: OutlineDelegate? init(outline: PDFOutline, delegate: OutlineDelegate?) { self.outline = outline self.delegate = delegate super.init(nibName: nil, bundle: nil) } ... override func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int { return outline.numberOfChildren } override func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell { let cell = tableView.dequeueReusableCell(withIdentifier: "Cell", for: indexPath) as UITableViewCell if let label = cell.textLabel, let title = outline.child(at: indexPath.row)?.label { label.text = String(title) } return cell } override func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) { if let page = outline.child(at: indexPath.row)?.destination?.page { delegate?.goTo(page: page) } } } 

图片

万岁! 因此,我们应用了PDFKit的3个主要功能。 该接口仍然有一些琐碎的细节,但是在本文中,我们将不再关注它们。 该项目对所有人开放。

Source: https://habr.com/ru/post/zh-CN431012/


All Articles