[SWIFT] Ich habe eine Viewer-App erstellt, die PDF anzeigt

TL;DR

Ich werde das erklären.

Demo

Image from Gyazo

Klicken Sie hier für die Quelle> https://github.com/dropcontrol/PDFViewer

Aus der Erklärung von View

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

Die Ansicht, die zum übergeordneten Element wird, ruft zwei Ansichten auf. Eines ist "ShowPDFView ()", das der Viewer-Teil der PDF-Datei ist, und das andere ist "PdfInfoView ()", das die Seitenzahl und die TOP-Schaltfläche darunter anzeigt. Also übergebe ich dort pdfInfo: pdfInfo, aber es ist in der Ansicht

@ObservedObject var pdfInfo: PDFInfo = PDFInfo()

In dem Teil von "@ ObservedObject" wird eine Instanz von "PDFInfo ()" erstellt, die "ObservableObject" ist. Und das PDFInfo () ist ...

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

Es sieht aus wie das. @ Publised erstellt Variablen wie pageNo, pdfView und stateTopButton. Darunter werden "func addObserver () {}" definiert, das sich beim Notification Center registriert, und die Funktion "@objc func pageChanged (_ Benachrichtigung: Benachrichtigung) {}", die ausgeführt wird, wenn eine Benachrichtigung empfangen wird. Darunter befinden sich die Seitenzahl und canGoToFirstPage, um festzustellen, ob es sich um die oberste Seite des PDF handelt.

In diesem Fall ist es notwendig, das PDF anzuzeigen,

@Published var pdfView: PDFView = PDFView()

Ich mache. Es wird also mit dem vorherigen "@ ObservedObject" initialisiert. Da ich "pdfInfo" in anderen "Ansichten" wiederverwenden möchte, übergebe ich es an die "Ansicht", die "pdfInfo" liest.

Über andere Ansichten

Da sich "PdfInfoView" in der Benutzeroberfläche befindet, können Sie es meiner Meinung nach durch Lesen der Quelle verstehen. Daher werde ich es weglassen und "ShowPDFView" erläutern. Hier sieht es so aus:

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

Das übergeordnete Element hat "pdfInfo" an das hier vorbereitete "@ ObservedObject var pdfInfo: PDFInfo" übergeben. Ich sehe nicht viele Beispiele, die eine Instanz vom übergeordneten Element übergeben, selbst wenn ich den Fall untersuche, in dem die Instanz mit "@ ObservedObject" wiederverwendet wird. Wenn ich dies jedoch nicht tue, kann ich nicht auf die im vorherigen "ObservableObject" festgelegte Variable verweisen.

Hier wird also "PDFViewer (pdfInfo: pdfInfo)" verwendet, um das eigentliche PDF anzuzeigen.

Über PDFViewer ()

In Bezug auf die PDF-Einstellungen ist die Schreibmethode mit UIViewController usw. fast dieselbe.

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 {
<PDF-Einstellungen hier>
    }
    
    func updateUIView(_ uiView: UIView, context: UIViewRepresentableContext<PDFViewer>) {
    }
    
}

Es wird mit "UIViewRepresentable" in Form von implementiert. Referenz:

Wenn Sie UIKit verwenden, sollten Sie es auf die gleiche Weise schreiben. Informationen zu den PDF-Einstellungen finden Sie in der Quelle und in anderen Ressourcen.

Was ich mit diesem Beispiel nicht machen konnte

Ich wollte die Möglichkeit zum Vergrößern / Verkleinern der PDF-Datei deaktivieren, dies ist jedoch in PDFKit nicht funktionsfähig implementiert. Daher prüfe ich es immer noch, aber ich würde mich freuen, wenn mir jemand sagen könnte, wie es geht.

Recommended Posts

Ich habe eine Viewer-App erstellt, die PDF anzeigt
Ich habe eine Chat-App erstellt.
Ich habe eine shopify App @java erstellt
Ich habe eine passende App erstellt (Android App)
[Android] Ich habe eine Schrittzähler-App erstellt.
Ich habe eine Janken App mit Kotlin gemacht
Ich habe eine Taschenrechner-App für Android erstellt
Ich habe eine Janken App mit Android gemacht
Ich habe eine Bibliothek erstellt, die in Safari wie ein Tab funktioniert !!
Ich habe einen Wrapper erstellt, der KNP von Java aus aufruft
Ich habe einen MOD erstellt, der sofort ein Fahrzeug mit Minecraft anruft
Ich habe ein PDF mit Java erstellt.
Ich habe eine einfache Empfehlungsfunktion erstellt.
Ich habe ein Tool zur Generierung von package.xml erstellt.
[Rails] Ich habe eine einfache Kalender-Mini-App mit benutzerdefinierten Spezifikationen erstellt.
Ich habe kürzlich eine JS-App in der gemunkelten Dart-Sprache erstellt
Ich habe eine Quelle erstellt, die automatisch eine JPA-Entitätsklassendatei generiert
[Ruby] Ich habe einen einfachen Ping-Client erstellt
Ich habe mit Ruby einen riskanten Würfel gemacht
Ich habe ein Plug-In für IntelliJ IDEA erstellt
Ich habe ein neues Java-Bereitstellungstool erstellt
Ich habe eine Klasse erstellt, die JUMAN und KNP aus Java verwenden kann
Ich habe eine Klasse erstellt, die automatisch Json generiert, die die Textur von Minecraft angibt [1.12.2]
Ich habe mit Vue.js eine Seite erstellt, die Informationen zur Zuckereinschränkung zusammenfasst
Ich werde die verdammte App enthüllen, die ich mir schwer gemacht habe, einen Job als Ingenieur von Unerfahrenen zu bekommen.
Ich habe einen THETA API-Client erstellt, der für die Plug-Entwicklung verwendet werden kann
Ein einfaches Beispiel für ein Servlet, das Japanisch anzeigt
Ich habe ein Diff-Tool für Java-Dateien erstellt
Ich habe ein Programm zur Beurteilung von Primzahlen in Java erstellt
04. Ich habe mit SpringBoot + Thymeleaf ein Frontend gemacht
Ich habe Mosaikkunst mit Pokemon-Bildern gemacht
Ich habe selbst eine App gemacht! (Leseverwaltungs-App)
Ich habe eine Android-App für den MiRm-Dienst erstellt
Ich habe ein Janken-Spiel in Java (CLI) gemacht.
Ich habe einen Docker-Container erstellt, um Maven auszuführen
Ich habe eine Ruby-Erweiterungsbibliothek in C erstellt
[Rails] Ich habe eine Entwurfsfunktion mit enum erstellt
Ich habe einen LINE Bot mit Rails + Heroku gemacht
RSpec-Sammlung, die ich häufig verwendet habe
Ich habe mit Ruby On Rails ein Portfolio erstellt
Ich habe StringUtils.isBlank gemacht
Ich habe mit der Lautstärketaste mit der Android-App ein Sperrmuster erstellt. Fragment Edition
Ich habe ein Docker-Image für die japanische Version von SDAPS erstellt
Ich habe ein einfaches Berechnungsproblemspiel in Java gemacht
Erstellen Sie ein Docker-Image, um eine einfache Java-App auszuführen
Ich habe ein Check-Tool für das Release-Modul erstellt
Ich habe eine Methode entwickelt, um nach Premium Friday zu fragen
[Ruby] Ich habe einen Crawler mit Anemone und Nokogiri gemacht.
Ich habe im Frühjahr einen Restful-Server und -Client erstellt.
SwiftUI --App-Entwicklung Ich habe versucht, solche Ansichten zu arrangieren.
Ich habe versucht, mit OCR eine PDF-Datei mit Java zu verarbeiten
Ich habe eine Bibliothek zum Anzeigen von Tutorials auf Android erstellt.
Ich habe eine Android-App erstellt, die mit HTTP abgerufen wird