0

我正在尝试使用 Swift 创建一个简单的 PDF。我收到一个错误:在“可选”上引用静态方法“buildBlock”要求“UIView”符合“视图”

可能做错了很多事情。我想我需要能够以某种方式将 UIView 更改为要显示的视图。

我的代码如下:

import SwiftUI
import PDFKit

public var documentData: Data?

let pdfView = PDFView()

func myPDF() -> Data {
  let pdfMetaData = [
    kCGPDFContextCreator: "my PDF",
    kCGPDFContextAuthor: "etienne"
  ]
  let format = UIGraphicsPDFRendererFormat()
  format.documentInfo = pdfMetaData as [String: Any]

  let pageWidth = 8.5 * 72.0
  let pageHeight = 11 * 72.0
  let pageRect = CGRect(x: 0, y: 0, width: pageWidth, height: pageHeight)

  let renderer = UIGraphicsPDFRenderer(bounds: pageRect, format: format)
  
  let data = renderer.pdfData { (context) in
  
    context.beginPage()
   
    let attributes = [
      NSAttributedString.Key.font: UIFont.boldSystemFont(ofSize: 72)
    ]
    let text = "Hello World!"
    text.draw(at: CGPoint(x: 0, y: 0), withAttributes: attributes)
  }

  return data
}



struct ContentView: View {
    var body: some View {
        Text("Hello, world!")
            .padding()
            .onAppear(perform: {
                if let data = documentData {
                  pdfView.document = PDFDocument(data: createFlyer())
                  pdfView.autoScales = true
                }
            })
        pdfView.documentView
    }
}

struct ContentView_Previews: PreviewProvider {
    static var previews: some View {
        ContentView()
    }
}
4

1 回答 1

0

我设法让这个工作与以下:

import SwiftUI
import PDFKit

public var documentData: Data?

let pdfView = PDFView()

func myPDF() -> Data {
  let pdfMetaData = [
    kCGPDFContextCreator: "my PDF",
    kCGPDFContextAuthor: "etienne"
  ]
  let format = UIGraphicsPDFRendererFormat()
  format.documentInfo = pdfMetaData as [String: Any]

  let pageWidth = 8.5 * 72.0
  let pageHeight = 11 * 72.0
  let pageRect = CGRect(x: 0, y: 0, width: pageWidth, height: pageHeight)

  let renderer = UIGraphicsPDFRenderer(bounds: pageRect, format: format)
  
  let data = renderer.pdfData { (context) in
  
    context.beginPage()
   
    let attributes = [
      NSAttributedString.Key.font: UIFont.boldSystemFont(ofSize: 72)
    ]
    let text = "Hello World!"
    text.draw(at: CGPoint(x: 0, y: 0), withAttributes: attributes)
  }

  return data
}

struct GeneratePDFView: UIViewRepresentable {
    init() {
    }

    func makeUIView(context: UIViewRepresentableContext<GeneratePDFView>) -> GeneratePDFView.UIViewType {
        let pdfView = PDFView()
        pdfView.document = PDFDocument(data: myPDF())
        return pdfView
    }

    func updateUIView(_ uiView: UIView, context: UIViewRepresentableContext<GeneratePDFView>) {
    }
}



struct ContentView: View {
    var body: some View {
        Text("Hello, world!")
            .padding()
            .onAppear(perform: {
            })
        GeneratePDFView()
    }
}

struct ContentView_Previews: PreviewProvider {
    static var previews: some View {
        ContentView()
    }
}

创建了一个返回生成的 PDFView 的 UIViewRepresentable。

我真的不明白这一点。因此,对此的任何评论都会很棒。

谢谢

于 2021-01-14T03:13:35.570 回答