在 Swift 5 中作为扩展:
extension UIView {
func takeSnapshot() -> UIImage? {
UIGraphicsBeginImageContext(CGSize(width: self.frame.size.width, height: self.frame.size.height - 5))
let rect = CGRect(x: 0.0, y: 0.0, width: self.frame.size.width, height: self.frame.size.height)
drawHierarchy(in: rect, afterScreenUpdates: true)
let image = UIGraphicsGetImageFromCurrentImageContext()
UIGraphicsEndImageContext()
return image
}
}
extension UIImage {
func saveToPhotoLibrary(_ completionTarget: Any?, _ completionSelector: Selector?) {
DispatchQueue.global(qos: .userInitiated).async {
UIImageWriteToSavedPhotosAlbum(self, completionTarget, completionSelector, nil)
}
}
}
extension UIAlertController {
func present() {
guard let controller = UIApplication.shared.windows.filter({$0.isKeyWindow}).first?.rootViewController else {
return
}
controller.present(self, animated: true)
}
}
在您的UIView
子类中:
func saveImage() {
let selector = #selector(self.onImageSaved(_:error:contextInfo:))
takeSnapshot()?.saveToPhotoLibrary(self, selector)
}
@objc private func onImageSaved(_ image: UIImage, error: Error?, contextInfo: UnsafeRawPointer) {
if let error = error {
let ac = UIAlertController(title: "Save error", message: error.localizedDescription, preferredStyle: .alert)
ac.addAction(UIAlertAction(title: "OK", style: .default))
ac.present()
} else {
let ac = UIAlertController(title: "Saved!", message: "Your altered image has been saved to your photos.", preferredStyle: .alert)
ac.addAction(UIAlertAction(title: "OK", style: .default))
ac.present()
}
onImageSaved?()
}