SwiftでPDFKitを使用して電子書籍リーダーを作成する

こんにちは 著者が約束したとおり、「SwiftでPDFをダウンロード、保存、表示する」という記事の続きを紹介します。PDFKitを詳しく見ていきます。



PDFKitはiOS 11に登場し、電子書籍リーダーアプリケーションの作成プロセスでお話ししたい3つの優れた機能があります。ページング、 コンテンツの表示 、ページアイコンです。



興味のある方、猫へようこそ。



画像



画像



画像

ページング、アウトライン、およびサムネイル



Initializer Injectionを使用した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のような驚くほど便利なものがあります。 必要なことは、 pdfViewthumbnailView.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に転送する必要があります。 そのため、目的のページ( page )に到達するために、ドキュメント( document )内のコンテンツの階層( outline )を掘り下げる必要があります



画像



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つの主要な機能を適用しました。 インターフェイスの些細な詳細がまだいくつかありますが、この記事ではそれらに焦点を合わせません。 このプロジェクトは誰でも利用できます。



All Articles