Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/objective-c/25.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ios 无法通过swift使用UIView创建pdf?_Ios_Objective C_Swift_Xcode_Pdf - Fatal编程技术网

Ios 无法通过swift使用UIView创建pdf?

Ios 无法通过swift使用UIView创建pdf?,ios,objective-c,swift,xcode,pdf,Ios,Objective C,Swift,Xcode,Pdf,我试图在我的swift应用程序中将自定义UIView保存为pdf,但失败了 所以我试着用同样的方法来处理OC,它工作得很好,但不能用swift 这是我使用swift和OC的测试代码,它们都可以在模拟器和设备中显示相同的块 斯威夫特: @objc class TestViewController: UIViewController { override func viewDidAppear(_ animated: Bool) { super.viewDidAppear(an

我试图在我的swift应用程序中将自定义UIView保存为pdf,但失败了

所以我试着用同样的方法来处理OC,它工作得很好,但不能用swift

这是我使用swift和OC的测试代码,它们都可以在模拟器和设备中显示相同的块

斯威夫特:

@objc class TestViewController: UIViewController {
    override func viewDidAppear(_ animated: Bool) {
        super.viewDidAppear(animated)
        let sub = UIView(frame: CGRect(x: 10, y: 10, width: 100, height: 100))
        sub.backgroundColor = .red
        view.addSubview(sub)

        let data = NSMutableData()
        UIGraphicsBeginPDFContextToData(data, view.bounds, nil)
        UIGraphicsBeginPDFPage()
        view.layer.draw(in: UIGraphicsGetCurrentContext()!)
        UIGraphicsEndPDFContext()

        let path = NSTemporaryDirectory() + "/pdftest_s.pdf"
        data.write(toFile: path, atomically: true)
        print(path)
    }
}
OC:

在Xcode 8.3和9.0中,beta6 OC工作正常,但在swift 3和4中则不行


我试图使用UIPrintPageRenderer,但它不起作用

在Obj代码中,您正在渲染view.layer

在swift代码中,您忘记了这样做

替换view.layer.drawin:UIGraphicsGetCurrentContext!带渲染


希望它对您渲染view.layer的Obj代码有所帮助

在swift代码中,您忘记了这样做

替换view.layer.drawin:UIGraphicsGetCurrentContext!带渲染


希望对您有帮助

您需要在当前图形环境中渲染视图。在swift3中,您可以按以下方式进行操作:

view.layer.renderin:UIGraphicsGetCurrentContext

根据苹果公司的文件

renderInContext:将层及其子层渲染到 指定的上下文


您需要在当前图形上下文中渲染视图。在swift3中,您可以按以下方式进行操作:

view.layer.renderin:UIGraphicsGetCurrentContext

根据苹果公司的文件

renderInContext:将层及其子层渲染到 指定的上下文


Swift 4.2中的更新代码:

使用以下UIView扩展可以从UIView轻松创建PDF

extension UIView {

  // Export pdf from Save pdf in drectory and return pdf file path
  func exportAsPdfFromView() -> String {

      let pdfPageFrame = self.bounds
      let pdfData = NSMutableData()
      UIGraphicsBeginPDFContextToData(pdfData, pdfPageFrame, nil)
      UIGraphicsBeginPDFPageWithInfo(pdfPageFrame, nil)
      guard let pdfContext = UIGraphicsGetCurrentContext() else { return "" }
      self.layer.render(in: pdfContext)
      UIGraphicsEndPDFContext()
      return self.saveViewPdf(data: pdfData)

  }

  // Save pdf file in document directory
  func saveViewPdf(data: NSMutableData) -> String {  
    let paths = FileManager.default.urls(for: .documentDirectory, in: .userDomainMask)
    let docDirectoryPath = paths[0]
    let pdfPath = docDirectoryPath.appendingPathComponent("viewPdf.pdf")
    if data.write(to: pdfPath, atomically: true) {
        return pdfPath.path
    } else {
        return ""
    }
  }
}

信用证:

Swift 4.2中更新的代码:

使用以下UIView扩展可以从UIView轻松创建PDF

extension UIView {

  // Export pdf from Save pdf in drectory and return pdf file path
  func exportAsPdfFromView() -> String {

      let pdfPageFrame = self.bounds
      let pdfData = NSMutableData()
      UIGraphicsBeginPDFContextToData(pdfData, pdfPageFrame, nil)
      UIGraphicsBeginPDFPageWithInfo(pdfPageFrame, nil)
      guard let pdfContext = UIGraphicsGetCurrentContext() else { return "" }
      self.layer.render(in: pdfContext)
      UIGraphicsEndPDFContext()
      return self.saveViewPdf(data: pdfData)

  }

  // Save pdf file in document directory
  func saveViewPdf(data: NSMutableData) -> String {  
    let paths = FileManager.default.urls(for: .documentDirectory, in: .userDomainMask)
    let docDirectoryPath = paths[0]
    let pdfPath = docDirectoryPath.appendingPathComponent("viewPdf.pdf")
    if data.write(to: pdfPath, atomically: true) {
        return pdfPath.path
    } else {
        return ""
    }
  }
}

信用证:

存在不同的view.layer.draw和self.view.layer渲染尝试修复它,并在更改渲染后重新尝试。谢谢。这里有不同的view.layer.draw和self.view.layer渲染。请尝试修复它,然后再试一次。更改为渲染后,它已工作。谢谢
extension UIView {

  // Export pdf from Save pdf in drectory and return pdf file path
  func exportAsPdfFromView() -> String {

      let pdfPageFrame = self.bounds
      let pdfData = NSMutableData()
      UIGraphicsBeginPDFContextToData(pdfData, pdfPageFrame, nil)
      UIGraphicsBeginPDFPageWithInfo(pdfPageFrame, nil)
      guard let pdfContext = UIGraphicsGetCurrentContext() else { return "" }
      self.layer.render(in: pdfContext)
      UIGraphicsEndPDFContext()
      return self.saveViewPdf(data: pdfData)

  }

  // Save pdf file in document directory
  func saveViewPdf(data: NSMutableData) -> String {  
    let paths = FileManager.default.urls(for: .documentDirectory, in: .userDomainMask)
    let docDirectoryPath = paths[0]
    let pdfPath = docDirectoryPath.appendingPathComponent("viewPdf.pdf")
    if data.write(to: pdfPath, atomically: true) {
        return pdfPath.path
    } else {
        return ""
    }
  }
}