Erstellen Sie einen eBook-Reader mit PDFKit auf Swift

Guten Tag! Ich präsentiere Ihnen die Fortsetzung des Artikels "PDF in Swift herunterladen, speichern und anzeigen", wie der Autor versprochen hat - wir werden uns PDFKit genauer ansehen.

PDFKit wurde in iOS 11 veröffentlicht und verfügt über drei großartige Funktionen, über die ich beim Erstellen einer eBook-Reader-Anwendung sprechen möchte: Paginierung , Inhalt anzeigen und Seitensymbol .

Jeder, der interessiert ist, willkommen bei Katze.

Bild

Bild

Bild
Paging, Gliederung und Miniaturansichten

Erstellen eines PDFViewControllers mit Initializer Injection

Beim Erstellen der URL- Variablen im PDFViewController haben wir sie unveränderlich gemacht. Aus diesem Grund habe ich Initializer Injection anstelle von Property Injection oder Method Injection gewählt .

Die einzige zu implementierende Variable ist pdfUrl , und der Rest: Dokument und Gliederung sind über den Bereich der lokalen Klasse zugänglich und können über init () initiiert werden.

Der Inhalt von pdfView ändert sich nicht, daher habe ich ihn mit dem variablen Dokument bezeichnet und ihn auch über init () initialisiert.

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) } } 

Stellen Sie die horizontale Paginierung ein

Jetzt haben wir den Inhalt im Dokument, den wir in pdfView.document geschrieben haben . Um wie in einem Buch einen horizontalen Bildlauf durchzuführen, müssen Sie PDFView mehrere Einstellungen hinzufügen.

 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 } 

Bild

Seitensymbole für eine einfache Navigation

PDFKit hat eine erstaunlich praktische Sache wie ThumbnailView. Sie müssen lediglich unsere pdfView der Eigenschaft thumbnailView.pdfView zuweisen. Und alle! Keine Delegierten, Benachrichtigungen oder andere Einstellungen.

 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) } 

Bild

Inhalt für die Kapitelnavigation anzeigen

Um zu einer bestimmten Seite zu gelangen, müssen wir eine bestimmte Seite ( PDFPage ) in pdfView übertragen . Wir müssen uns also mit der Hierarchie des Inhalts ( Gliederung ) im Dokument ( Dokument ) befassen, um zur gewünschten Seite ( Seite ) zu gelangen.

Bild

Ich verwende UITableViewController als Popup ( popOver ). Deshalb brauche ich:

  1. Erstellen Sie ein Protokoll. UITableViewController muss diesem Protokoll folgen.
  2. Fügen Sie einige Delegate-Methoden hinzu, um im PDFViewController auf pdfView zuzugreifen .
  3. Rufen Sie die Delegate-Methode auf, wenn der Benutzer eine bestimmte Zelle auswählt.

 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) } } } 

Bild

Hurra! Also haben wir die 3 Hauptfunktionen von PDFKit angewendet. Es gibt noch einige triviale Details der Benutzeroberfläche, aber in diesem Artikel werden wir uns nicht auf sie konzentrieren. Das Projekt steht allen zur Verfügung.

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


All Articles