[SWIFT] J'ai créé une application de visualisation qui affiche le PDF

TL;DR

Je vais expliquer à ce sujet.

démo

Image from Gyazo

Cliquez ici pour la source> https://github.com/dropcontrol/PDFViewer

De l'explication de View

struct ContentView: View {
    @ObservedObject var pdfInfo: PDFInfo = PDFInfo()
    
    var body: some View {
        VStack {
            ShowPDFView(pdfInfo: pdfInfo)
            PdfInfoView(pdfInfo: pdfInfo)
            .padding()
        }.onAppear(){
            pdfInfo.addObserver()
        }
        
    }
}

La vue qui devient le parent appelle deux vues. L'un est «ShowPDFView ()», qui est la partie visionneuse du PDF, et l'autre est «PdfInfoView ()», qui affiche le numéro de page et le bouton TOP en dessous. Donc je passe pdfInfo: pdfInfo ici, mais c'est sur la vue

@ObservedObject var pdfInfo: PDFInfo = PDFInfo()

Dans la partie de, @ ObservedObject crée une instance de PDFInfo () qui est ObservableObject. Et que «PDFInfo ()» est ...

class PDFInfo: ObservableObject {
    @Published var pageNo: Int = 1
    @Published var pdfView: PDFView = PDFView()
    @Published var stateTopButton: Bool = false
    
    func addObserver() {
        NotificationCenter.default.addObserver(self, selector: #selector(self.pageChanged(_:)), name: Notification.Name.PDFViewPageChanged, object: nil)
    }
    
    @objc func pageChanged(_ notification: Notification) {
        pageNo = pdfView.currentPage!.pageRef!.pageNumber
        stateTopButton = pdfView.canGoToFirstPage
        print(self.pageNo)
        print("page is changed")
    }
}

Ça ressemble à ça. @ Publised crée des variables telles que pageNo, pdfView et stateTopButton. En dessous, func addObserver () {}, qui s'enregistre auprès du centre de notifications, et la fonction de @objc func pageChanged (_ notification: Notification) {}, qui est exécutée lorsque la notification est reçue, sont définies. Parmi eux se trouvent le numéro de page et canGoToFirstPage pour déterminer s'il s'agit de la première page du PDF.

Donc, en cela, il est nécessaire d'afficher le PDF,

@Published var pdfView: PDFView = PDFView()

Je fais. Ainsi, il est initialisé avec le précédent @ ObservedObject. Parce que je veux réutiliser pdfInfo dans d'autresViews, je le passe à la View qui lit pdfInfo.

À propos des autres vues

Puisque PdfInfoView est dans l'interface utilisateur, je pense que vous pouvez le comprendre en lisant la source, donc je vais l'omettre et expliquer ShowPDFView. Ici, cela ressemble à ceci:

struct ShowPDFView: View {
    @ObservedObject var pdfInfo: PDFInfo
    
    var body: some View {
        PDFViewer(pdfInfo: pdfInfo)
    }
}

Le parent a transmis pdfInfo au @ ObservedObject var pdfInfo: PDFInfo préparé ici. Je ne vois pas beaucoup d'échantillons qui passent une instance du parent même si j'étudie le cas où l'instance est réutilisée avec @ ObservedObject, mais si je ne fais pas cela, je ne peux pas faire référence à la variable définie dans le précédent ObservableObject.

Donc, ici, PDF Viewer (pdfInfo: pdfInfo) est utilisé pour afficher le PDF réel.

À propos de PDFViewer ()

En ce qui concerne les paramètres PDF, la méthode d'écriture avec UIViewController etc. est presque la même,

struct PDFViewer: UIViewRepresentable {
    @ObservedObject var pdfInfo: PDFInfo
    
    let url: URL = Bundle.main.url(forResource: "Oz was Wizard - Original Soundtrack", withExtension: "pdf")!
    
    func makeUIView(context: UIViewRepresentableContext<PDFViewer>) -> PDFViewer.UIViewType {
<Paramètres PDF ici>
    }
    
    func updateUIView(_ uiView: UIView, context: UIViewRepresentableContext<PDFViewer>) {
    }
    
}

Il est implémenté en utilisant UIViewRepresentable sous la forme de. référence:

Lorsque vous utilisez UIKit, il semble que vous devriez l'écrire de la même manière. Veuillez vous référer à la source et aux autres ressources pour les paramètres PDF.

Ce que je ne pouvais pas faire avec cet échantillon

Je voulais désactiver la possibilité de zoomer / dézoomer le PDF, mais cela n'est pas implémenté de manière fonctionnelle dans PDFKit, donc je suis toujours en train de l'examiner, mais je serais heureux si quelqu'un pouvait me dire comment le faire.

Recommended Posts

J'ai créé une application de visualisation qui affiche le PDF
J'ai créé une application de chat.
J'ai créé une application shopify @java
J'ai créé une application correspondante (application Android)
[Android] J'ai créé une application de podomètre.
J'ai créé une application Janken avec kotlin
J'ai créé une application de calculatrice sur Android
J'ai créé une application Janken avec Android
J'ai créé une bibliothèque qui fonctionne comme un onglet dans Safari !!
J'ai créé un Wrapper qui appelle KNP depuis Java
J'ai créé un MOD qui appelle instantanément un véhicule avec Minecraft
J'ai créé un PDF avec Java.
J'ai fait une simple fonction de recommandation.
J'ai créé un outil de génération package.xml.
[Rails] J'ai créé une mini-application de calendrier simple avec des spécifications personnalisées.
J'ai récemment créé une application js dans le langage courant de Dart
J'ai créé une source qui génère automatiquement un fichier de classe d'entité JPA
J'ai posé une question qui peut être utilisée pour des entretiens techniques
[Ruby] J'ai créé un simple client Ping
J'ai fait une mort risquée avec Ruby
J'ai créé un plug-in pour IntelliJ IDEA
J'ai créé un nouvel outil de déploiement Java
J'ai créé une classe qui peut utiliser JUMAN et KNP de Java
J'ai créé une classe qui génère automatiquement Json qui spécifie la texture de Minecraft [1.12.2]
J'ai créé un site qui résume les informations sur la restriction du sucre avec Vue.js
Je vais exposer la putain d'application que j'ai rendue difficile pour obtenir un emploi d'ingénieur sans expérience.
J'ai créé un client API THETA qui peut être utilisé pour le développement de plugins
Un exemple simple de servlet qui affiche le japonais
J'ai créé un outil Diff pour les fichiers Java
J'ai créé un programme de jugement des nombres premiers en Java
04. J'ai fait un frontal avec SpringBoot + Thymeleaf
J'ai fait de l'art de la mosaïque avec des images Pokemon
J'ai créé une application par moi-même! (Application de gestion de la lecture)
J'ai créé une application Android pour le service MiRm
J'ai créé un jeu Janken en Java (CLI)
J'ai créé un conteneur Docker pour exécuter Maven
J'ai créé une bibliothèque d'extension Ruby en C
[Rails] J'ai créé une fonction de brouillon en utilisant enum
J'ai créé un robot LINE avec Rails + heroku
Collection RSpec que j'ai fréquemment utilisée
J'ai fait un portfolio avec Ruby On Rails
J'ai créé StringUtils.isBlank
J'ai créé un schéma de verrouillage à l'aide de la touche de volume avec l'application Android. Édition fragmentée
J'ai créé une image Docker pour la version japonaise de SDAPS
J'ai fait un jeu de problèmes de calcul simple en Java
Créer une image docker pour exécuter une application Java simple
J'ai créé un outil de vérification pour le module de version
J'ai fait une méthode pour demander la prime vendredi
[Ruby] J'ai fait un robot avec de l'anémone et du nokogiri.
J'ai créé un serveur et un client Restful au printemps.
SwiftUI - Développement d'applications J'ai essayé d'organiser des vues comme ça.
[Rails] Volume qui affiche les favoris et une liste de favoris
J'ai essayé OCR de traiter un fichier PDF avec Java
J'ai créé une bibliothèque pour afficher des tutoriels sur Android.
J'ai créé une application Android qui GET avec HTTP