Итак, с вашим расширением вы получите UIImage
, если хотите, вы можете сохранить его как JPEG
или PNG
, преобразовав его в Data
или NSData
в Objective C:
let viewSnapshot = view.createTransparentImage()
//save as JPEG
if let data = viewSnapshot.jpegData(compressionQuality: 0.8) {
//variable data has the JPEG image with quality of 80%
}
//save as PNG
if let data = viewSnapshot.pngData() {
//variable data has the PNG data of the snapshot
}
Если вы хотите сохранить это изображение, вы можете просто сделать следующее внутри if let data
let paths = FileManager.default.urls(for: .documentDirectory, in: .userDomainMask)
if let documentsDirectory = paths.first {
let fileName = documentsDirectory.appendingPathComponent("myImage.jpg")
try? data.write(to: fileName)
}
Учитывая, что вам не нужен UIImage
, а только JPEG data
просто сделайте небольшие изменения в своем расширении следующим образом:
extension UIView{
func createImageData(quality: CGFloat = 0.8) -> Data {
let renderFormat = UIGraphicsImageRendererFormat.default()
renderFormat.opaque = false
self.isOpaque = false
self.layer.isOpaque = true
self.backgroundColor = UIColor.clear
self.layer.backgroundColor = UIColor.clear.cgColor
let renderer = UIGraphicsImageRenderer(size: bounds.size, format: renderFormat)
return renderer.jpegData(withCompressionQuality: quality, actions: { context in
layer.render(in: context.cgContext)
})
}
}
Обратите внимание, что последняя строка была изменена на:
return renderer.jpegData(withCompressionQuality: quality, actions: { context in
Таким образом, чтобы использовать это, вы можете просто сделать:
let viewSnapshotData = view.createImageData(quality: 0.9)
Согласно LeoDabus вы можете использовать следующее расширение для получения снимка UIView
с альфа-прозрачностью, если это необходимо:
extension UIView {
var snapshot: UIImage {
isOpaque = false
backgroundColor = .clear
let format = UIGraphicsImageRendererFormat.default()
format.opaque = false
return UIGraphicsImageRenderer(size: bounds.size, format: format).image { _ in
drawHierarchy(in: bounds, afterScreenUpdates: true)
}
}
}