How to take screenshot of a UIView in swift? How to take screenshot of a UIView in swift? ios ios

How to take screenshot of a UIView in swift?


For drawing of one view, just use this:

    // Begin context    UIGraphicsBeginImageContextWithOptions(view.bounds.size, false, UIScreen.mainScreen().scale)    // Draw view in that context    drawViewHierarchyInRect(view.bounds, afterScreenUpdates: true)    // And finally, get image    let image = UIGraphicsGetImageFromCurrentImageContext()    UIGraphicsEndImageContext()

If you want to use it multiple times, probably extension would do the job:

//Swift4

extension UIView {    func takeScreenshot() -> UIImage {        // Begin context        UIGraphicsBeginImageContextWithOptions(self.bounds.size, false, UIScreen.main.scale)        // Draw view in that context        drawHierarchy(in: self.bounds, afterScreenUpdates: true)        // And finally, get image        let image = UIGraphicsGetImageFromCurrentImageContext()        UIGraphicsEndImageContext()        if (image != nil)        {            return image!        }        return UIImage()    }}

//Old Swift

extension UIView {    func takeScreenshot() -> UIImage {        // Begin context        UIGraphicsBeginImageContextWithOptions(self.bounds.size, false, UIScreen.mainScreen().scale)        // Draw view in that context        drawViewHierarchyInRect(self.bounds, afterScreenUpdates: true)        // And finally, get image        let image = UIGraphicsGetImageFromCurrentImageContext()        UIGraphicsEndImageContext()        return image    }}

To explain what those parameters do:

UIGraphicsBeginImageContextWithOptions() creates a temporary rendering context into which the original is drawn. The first argument, size, is the target size of the scaled image. The second argument, isOpaque is used to determine whether an alpha channel is rendered. Setting this to false for images without transparency (i.e. an alpha channel) may result in an image with a pink hue. The third argument scale is the display scale factor. When set to 0.0, the scale factor of the main screen is used, which for Retina displays is 2.0 or higher (3.0 on the iPhone 6 Plus).

More about it here http://nshipster.com/image-resizing/

As for the draw call, Apple Docs explains it to detail here and here


swift 4 and iOS 10+

extension UIView {  func screenshot() -> UIImage {    return UIGraphicsImageRenderer(size: bounds.size).image { _ in      drawHierarchy(in: CGRect(origin: .zero, size: bounds.size), afterScreenUpdates: true)    }  }}


An alternative for Alessandro's answer, a bit more brief and Swift style:

extension UIView {    var snapshot: UIImage {        return UIGraphicsImageRenderer(size: bounds.size).image { _ in            drawHierarchy(in: bounds, afterScreenUpdates: true)        }    }}