TL;DR
Ich werde das erklären.
Klicken Sie hier für die Quelle> https://github.com/dropcontrol/PDFViewer
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.
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.
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.
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