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

Source: https://habr.com/ru/post/J431012/


All Articles