Ios 无法通过swift使用UIView创建pdf?
我试图在我的swift应用程序中将自定义UIView保存为pdf,但失败了 所以我试着用同样的方法来处理OC,它工作得很好,但不能用swift 这是我使用swift和OC的测试代码,它们都可以在模拟器和设备中显示相同的块 斯威夫特: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
@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 ""
}
}
}