Вы можете позвонить так:
let data = NSMutableData()
UIGraphicsBeginPDFContextToData(data, .zero, nil)
// process view
UIGraphicsEndPDFContext()
data as Data
// now you get the data
Когда яблоко говорит , используйте этот метод UIGraphicsBeginPDFContextToData(_:_:_:)
для сохранения PDF.
Создает PDFграфический контекст на основе, который нацелен на указанный изменяемый объект данных.
Объявление
func UIGraphicsBeginPDFContextToData (_ data: NSMutableData, _ bounds: CGRect, _ documentInfo: [AnyHashable: Any]?)
Параметры
data
Объект данных для получения выходных данных PDF.
Вы также можете записать представление PDF на диск, используя UIGraphicsBeginPDFContextToFile(_:_:_:)
UIGraphicsBeginPDFContextToFile(filePath, .zero, nil)
// do the view rendering
UIGraphicsEndPDFContext()
Вот пример:
class ViewController: UIViewController {
// обрабатывает представления и вызывает, чтобы сохранить их как представление PDF
override func viewDidLoad() {
super.viewDidLoad()
// Do any additional setup after loading the view, typically from a nib.
let v1 = UIScrollView(frame: CGRect(x: 0, y: 0, width: 100, height: 100))
v1.contentSize = CGSize(width: 100, height: 100)
let v2 = UIView(frame: CGRect(x: 0, y: 0, width: 100, height: 200))
let v3 = UIView(frame: CGRect(x: 0, y: 0, width: 100, height: 200))
v1.backgroundColor = UIColor.red
v2.backgroundColor = UIColor.green
v3.backgroundColor = UIColor.blue
let dst = NSHomeDirectory() + "/dng.pdf"
UIGraphicsBeginPDFContextToFile(dst, .zero, nil)
[v1, v2, v3].forEach{ (view : UIView)
in
autoreleasepool {
self.renderPDFPage(view: view)
}
}
UIGraphicsEndPDFContext()
}
// запускаетсядля визуализации
func renderPDFPage(view: UIView) {
func renderScrollView(_ scrollView: UIScrollView) {
let tmp = scrollView.tempInfo
scrollView.transformForRender()
_render(scrollView) { scrollView in
if let scrollView = scrollView as? UIScrollView{
scrollView.restore(tmp)
}
}
}
if let scrollView = view as? UIScrollView {
renderScrollView(scrollView)
} else {
_render(view)
}
}
func getPageSize(_ view: UIView) -> CGSize {
switch view {
case (let scrollView as UIScrollView):
return scrollView.contentSize
default:
return view.frame.size
}
}
func _render(_ view: UIView, completion: (UIView) -> Void = { _ in }) {
let size: CGSize = getPageSize(view)
guard size.width > 0 && size.height > 0 else {
return
}
guard let context = UIGraphicsGetCurrentContext() else {
return
}
let renderFrame = CGRect(origin: CGPoint(x: 0.0 , y: 0.0),
size: CGSize(width: size.width, height: size.height))
autoreleasepool {
let superView = view.superview
view.removeFromSuperview()
UIGraphicsBeginPDFPageWithInfo(CGRect(origin: .zero, size: renderFrame.size), nil)
context.translateBy(x: -renderFrame.origin.x, y: -renderFrame.origin.y)
view.layer.render(in: context)
superView?.addSubview(view)
superView?.layoutIfNeeded()
completion(view)
}
}
}
// Методы Util для обработки UIScrollView
private extension UIScrollView {
typealias TempInfo = (frame: CGRect, offset: CGPoint, inset: UIEdgeInsets)
var tempInfo: TempInfo {
return (frame, contentOffset, contentInset)
}
func transformForRender() {
contentOffset = .zero
contentInset = UIEdgeInsets.zero
frame = CGRect(origin: .zero, size: contentSize)
}
func restore(_ info: TempInfo) {
frame = info.frame
contentOffset = info.offset
contentInset = info.inset
}
}