下午好 正如作者所承诺的那样,我将继续向您介绍“在Swift中下载,保存和查看PDF”一文-我们将仔细研究PDFKit。
PDFKit出现在iOS 11中,它具有3个很棒的功能,在创建eBook阅读器应用程序的过程中,我想谈一谈:
分页 ,
显示内容和页面
图标 。
每个有兴趣的人,欢迎猫。


分页,大纲和缩略图使用初始化注入创建PDFViewController在PDFViewController中创建
URL变量时,我们使其变为不可变的。 这就是为什么我选择
初始化注入而不是
属性注入或
方法注入的原因 。
唯一实现的变量是
pdfUrl ,其余的:
document和
outline可通过本地类的范围访问,并可通过
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 )。 因此,我需要:
- 创建一个协议。 UITableViewController必须遵循此协议。
- 添加一些委托方法来访问PDFViewController中的pdfView 。
- 当用户选择特定的单元格时,调用委托方法。
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个主要功能。 该接口仍然有一些琐碎的细节,但是在本文中,我们将不再关注它们。 该项目对所有人开放。