Créer un lecteur de livre électronique à l'aide de PDFKit sur Swift

Bon après-midi Je vous présente la suite de l'article «Téléchargez, enregistrez et visualisez le PDF dans Swift», comme l'auteur l'a promis - nous allons regarder de plus près PDFKit.

PDFKit est apparu dans iOS 11, et il a 3 grandes fonctionnalités dont je voudrais parler dans le processus de création d'une application de lecteur de livre électronique: la pagination , le contenu d'affichage et l' icône de page.

Tous ceux qui sont intéressés, bienvenue au chat.

image

image

image
Pagination, contour et vignettes

Création d'un PDFViewController avec injection d'initialisation

Lors de la création de la variable URL dans PDFViewController, nous l'avons rendue immuable. C'est pourquoi j'ai choisi l' injection d'initialisation plutôt que l'injection de propriété ou l' injection de méthode .

La seule variable implémentée est pdfUrl , et le reste: document et aperçu , sont accessibles via la portée de la classe locale et peuvent être lancés via init () .

Le contenu de pdfView ne change pas, je l'ai donc désigné avec le document variable et l'ai également initialisé via 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) } } 

Définir la pagination horizontale

Nous avons maintenant le contenu du document, que nous avons écrit dans pdfView.document . Afin de faire un défilement horizontal, comme dans un livre, vous devez ajouter plusieurs paramètres à 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 } 

image

Icônes de page pour une navigation facile

PDFKit a une chose incroyablement pratique comme ThumbnailView. Tout ce que vous devez faire est d'affecter notre pdfView à la propriété thumbnailView.pdfView . Et c'est tout! Aucun délégué, aucune notification ou autre paramètre.

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

image

Afficher le contenu pour la navigation dans les chapitres

Pour accéder à une page spécifique, nous devons transférer une page spécifique ( PDFPage ) vers pdfView . Il nous faut donc nous plonger dans la hiérarchie du contenu ( plan ) du document ( document ) pour arriver à la page souhaitée ( page ).

image

J'utilise UITableViewController en tant que popup ( popOver ). Par conséquent, j'ai besoin de:

  1. Créez un protocole. UITableViewController doit suivre ce protocole.
  2. Ajoutez des méthodes déléguées pour accéder à pdfView dans PDFViewController .
  3. Appelez la méthode déléguée lorsque l'utilisateur sélectionne une cellule spécifique.

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

image

Hourra! Nous avons donc appliqué les 3 fonctions principales de PDFKit. Il y a encore quelques détails triviaux sur l'interface, mais dans cet article, nous ne nous concentrerons pas sur eux. Le projet est accessible à tous.

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


All Articles