TL;DR
Je vais expliquer à ce sujet.
Cliquez ici pour la source> 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()
}
}
}
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'autresView
s, je le passe à la View
qui lit pdfInfo
.
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.
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.
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