How to convert a UIView to an image How to convert a UIView to an image swift swift

How to convert a UIView to an image


An extension on UIView should do the trick.

extension UIView {    // Using a function since `var image` might conflict with an existing variable    // (like on `UIImageView`)    func asImage() -> UIImage {        let renderer = UIGraphicsImageRenderer(bounds: bounds)        return renderer.image { rendererContext in            layer.render(in: rendererContext.cgContext)        }    }}

Apple discourages using UIGraphicsBeginImageContext starting iOS 10 with the introduction of the P3 color gamut. UIGraphicsBeginImageContext is sRGB and 32-bit only. They introduced the new UIGraphicsImageRenderer API that is fully color managed, block-based, has subclasses for PDFs and images, and automatically manages the context lifetime. Check out WWDC16 session 205 for more details (image rendering begins around the 11:50 mark)

To be sure that it works on every device, use #available with a fallback to earlier versions of iOS:

extension UIView {    // Using a function since `var image` might conflict with an existing variable    // (like on `UIImageView`)    func asImage() -> UIImage {        if #available(iOS 10.0, *) {            let renderer = UIGraphicsImageRenderer(bounds: bounds)            return renderer.image { rendererContext in                layer.render(in: rendererContext.cgContext)            }        } else {            UIGraphicsBeginImageContext(self.frame.size)            self.layer.render(in:UIGraphicsGetCurrentContext()!)            let image = UIGraphicsGetImageFromCurrentImageContext()            UIGraphicsEndImageContext()            return UIImage(cgImage: image!.cgImage!)        }    }}


you can use extension

extension UIImage {    convenience init(view: UIView) {        UIGraphicsBeginImageContext(view.frame.size)        view.layer.render(in:UIGraphicsGetCurrentContext()!)        let image = UIGraphicsGetImageFromCurrentImageContext()        UIGraphicsEndImageContext()        self.init(cgImage: image!.cgImage!)    }}

Here the swift 3/4 version :

extension UIImage {    convenience init(view: UIView) {        UIGraphicsBeginImageContext(view.frame.size)        view.layer.render(in:UIGraphicsGetCurrentContext()!)        let image = UIGraphicsGetImageFromCurrentImageContext()        UIGraphicsEndImageContext()        self.init(cgImage: image!.cgImage!)    }}


Convert your UIView to image by drawViewHierarchyInRect:afterScreenUpdates: which is many times faster than renderInContext

Important note: do not call this function from viewDidLoad or viewWillAppear , make sure you are capturing a view after it is it displayed /loaded fully

Obj C

     UIGraphicsBeginImageContextWithOptions(myView.bounds.size, myView.opaque, 0.0f);     [myView drawViewHierarchyInRect:myView.bounds afterScreenUpdates:NO];     UIImage *snapshotImageFromMyView = UIGraphicsGetImageFromCurrentImageContext();     UIGraphicsEndImageContext();     myImageView.image =  snapshotImageFromMyView;

Save the edited image Photo album

     UIImageWriteToSavedPhotosAlbum(snapshotImageFromMyView, nil,nil, nil);

Swift 3/4

    UIGraphicsBeginImageContextWithOptions(myView.bounds.size, myView.isOpaque, 0.0)    myView.drawHierarchy(in: myView.bounds, afterScreenUpdates: false)    let snapshotImageFromMyView = UIGraphicsGetImageFromCurrentImageContext()    UIGraphicsEndImageContext()    print(snapshotImageFromMyView)    myImageView.image = snapshotImageFromMyView

Super easy generalization with extension , iOS11 , swift3/4

extension UIImage{    convenience init(view: UIView) {    UIGraphicsBeginImageContextWithOptions(view.bounds.size, view.isOpaque, 0.0)    view.drawHierarchy(in: view.bounds, afterScreenUpdates: false)    let image = UIGraphicsGetImageFromCurrentImageContext()    UIGraphicsEndImageContext()    self.init(cgImage: (image?.cgImage)!)  }}Use :  //myView is completly loaded/visible , calling this code after only after viewDidAppear is call imgVV.image = UIImage.init(view: myView) // Simple image object let img =  UIImage.init(view: myView)