首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何用迅捷pdf编程更改网页?

如何用迅捷pdf编程更改网页?
EN

Stack Overflow用户
提问于 2022-02-22 01:11:46
回答 1查看 191关注 0票数 0

我有一个代码来显示pdf

代码语言:javascript
复制
  import PDFKit
import SwiftUI

struct PDFKitRepresentedView: UIViewRepresentable {
    typealias UIViewType = PDFView

    let data: Data
    let singlePage: Bool
    var doc:PDFView=PDFView()
    init(_ data: Data, singlePage: Bool = false) {
        self.data = data
        self.singlePage = singlePage
    }

    func makeUIView(context _: UIViewRepresentableContext<PDFKitRepresentedView>) -> UIViewType {
        // Create a `PDFView` and set its `PDFDocument`.
        let pdfView = doc
        pdfView.document = PDFDocument(data: data)
        pdfView.autoScales = true
        if singlePage {
            pdfView.displayMode = .singlePage
        }
        return pdfView
    }
    
    func updateUIView(_ pdfView: UIViewType, context _:                  UIViewRepresentableContext<PDFKitRepresentedView>) {
        pdfView.document = PDFDocument(data: data)
        
      }
    }
    struct ContentView: View {
     var path=Bundle.main.url(forResource: "big", withExtension:  "pdf");
     @State var doc:PDFKitRepresentedView=PDFKitRepresentedView(Data())
     @State var data :Data?;
     var body: some View {
        HStack{
            start(doc: &doc,path: path!)
                .onAppear(perform: {
                    self.data=try?Data(contentsOf: path!);
                    doc.doc.goToNextPage(nil)
                    doc.doc.goToNextPage(nil)
                })
        }
        }
    }

    func start(doc:inout PDFKitRepresentedView,path:URL)->PDFKitRepresentedView{
      doc=try!PDFKitRepresentedView(Data(contentsOf: path));
      return doc;
    }

但我似乎找不到方法来更改显示pdf.I中的页面,我尝试了go(),但是它崩溃了。我需要一个按钮来更改click.Sorry上的页面,我是swiftUI新手。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2022-02-22 02:26:35

您可以重新构造代码,并使用以下方法将Buttons中的页面选择添加到func updateUIView(...)中:

代码语言:javascript
复制
import PDFKit
import SwiftUI

struct PDFKitView: UIViewRepresentable {
    typealias UIViewType = PDFView
    
    @Binding var page: Int
    @State var data: Data
    let singlePage: Bool
    
    func makeUIView(context: UIViewRepresentableContext<PDFKitView>) -> UIViewType {
        let pdfView = PDFView()
        pdfView.document = PDFDocument(data: data)
        pdfView.autoScales = true
        if singlePage {
            pdfView.displayMode = .singlePage
        }
        return pdfView
    }

    func updateUIView(_ view: UIViewType, context: UIViewRepresentableContext<PDFKitView>) {
        if let thePage = view.document?.page(at: page) {
            view.go(to: thePage)
        }
    }
}

struct ContentView: View {
    @State var page = 0
    
    var body: some View {
        VStack {
            HStack {
                Button("Next Page") { page += 1 } // need to add bounds check
                Button("Prev Page") { page -= 1 } // need to add bounds check
            }.buttonStyle(.bordered)
            PDFKitView(page: $page, data: loadData(), singlePage: true)
        }
    }
    
    private func loadData() -> Data {
        guard let path = Bundle.main.url(forResource: "big", withExtension:  "pdf") else {
            print("Could not find PDF document")
            return Data()
        }
        do {
            return try Data(contentsOf: path)
        } catch {
            print("error: \(error)") // todo
            return Data()
        }
    }
}

编辑-1:

另一种更灵活的方法是将PDFDocument传递到PDFKitView中,例如:

代码语言:javascript
复制
struct PDFKitView: UIViewRepresentable {
    typealias UIViewType = PDFView
    
    @Binding var page: Int
    @Binding var doc: PDFDocument
    let singlePage: Bool
    
    func makeUIView(context: UIViewRepresentableContext<PDFKitView>) -> UIViewType {
        let pdfView = PDFView()
        pdfView.document = doc
        pdfView.autoScales = true
        if singlePage {
            pdfView.displayMode = .singlePage
        }
        return pdfView
    }

    func updateUIView(_ view: UIViewType, context: UIViewRepresentableContext<PDFKitView>) {
        view.document = doc
        if let thePage = view.document?.page(at: page) {
            view.go(to: thePage)
        }
    }
}

struct ContentView: View {
    @State var page = 0
    @State var doc = PDFDocument()
    
    var body: some View {
        VStack {
            HStack {
                Button("Next Page") {
                    if page + 1 < doc.pageCount {
                        page += 1
                    }
                }
                Button("Prev Page") {
                    if page-1 > 0 {
                        page -= 1
                    }
                }
            }.buttonStyle(.bordered)
            PDFKitView(page: $page, doc: $doc, singlePage: true)
        }
        .onAppear {
            loadDoc()
        }
    }
    
    private func loadDoc() {
        guard let path = Bundle.main.url(forResource: "big", withExtension: "pdf") else {
            print("Could not find PDF document")
            return
        }
        do {
            let data = try Data(contentsOf: path)
            if let theDoc = PDFDocument(data: data) {
                doc = theDoc
            }
        } catch {
            print("error: \(error)") // todo
        }
    }
}
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/71214804

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档