Search code examples
iosiphoneimageswiftscreenshot

Screenshot in Swift iOS?


How can I take screenshot from my screen by code (in Swift) and save it? Can I take screenshot and save it as image?

I've looked and I see this code, but I can't use it (I think) because it doesn't do anything.

var screen = UIScreen.mainScreen()
snapshotVieww = screen.snapshotViewAfterScreenUpdates(false)
UIGraphicsBeginImageContextWithOptions(screen.bounds.size, false, 0)
snapshotVieww.drawViewHierarchyInRect(view.bounds, afterScreenUpdates: true)
var image:UIImage = UIGraphicsGetImageFromCurrentImageContext()
UIGraphicsEndImageContext()
provino = UIImageView(image: image)

Solution

  • With Swift 4 / iOS 10.3, you can choose one of the following ways in order to solve your problem.


    1. Take a screenshot of a view controller's view

    The following code shows how to take a screenshot and save it in the device photo album:

    import UIKit
    
    class ViewController: UIViewController {
    
        /* ... */
    
        @IBAction func screenshot(_ sender: UIBarButtonItem) {
            //Create the UIImage
            UIGraphicsBeginImageContextWithOptions(view.frame.size, true, 0)
            guard let context = UIGraphicsGetCurrentContext() else { return }
            view.layer.render(in: context)
            guard let image = UIGraphicsGetImageFromCurrentImageContext() else { return }
            UIGraphicsEndImageContext()
            
            //Save it to the camera roll
            UIImageWriteToSavedPhotosAlbum(image, nil, nil, nil)
        }
    
    }
    

    Note that the result of this code will be a .JPG image. Also note that the navigation bar and the status bar will not appear in the final image.

    Since iOS 10, as an alternative to the previous code, you can use the code below:

    import UIKit
    
    class ViewController: UIViewController {
    
        /* ... */
    
        @IBAction func screenshot(_ sender: UIBarButtonItem) {
            //Create the UIImage
            let renderer = UIGraphicsImageRenderer(size: view.frame.size)
            let image = renderer.image(actions: { context in
                view.layer.render(in: context.cgContext)
            })
            
            //Save it to the camera roll
            UIImageWriteToSavedPhotosAlbum(image, nil, nil, nil)
        }
    
    }
    

    2. Take a screenshot of an iPhone window

    If you want to take a screenshot that includes the navigation bar (but not the status bar), you can use the following code:

    import UIKit
    
    class ViewController: UIViewController {
    
        /* ... */
    
        @IBAction func screenshot(_ sender: UIBarButtonItem) {
            //Create the UIImage
            guard let layer = UIApplication.shared.keyWindow?.layer else { return }
            UIGraphicsBeginImageContextWithOptions(layer.frame.size, true, 0)
            guard let context = UIGraphicsGetCurrentContext() else { return }
            layer.render(in: context)
            guard let image = UIGraphicsGetImageFromCurrentImageContext() else { return }
            UIGraphicsEndImageContext()
            
            //Save it to the camera roll
            UIImageWriteToSavedPhotosAlbum(image, nil, nil, nil)
        }
     
    }
    

    Since iOS 10, as an alternative to the previous code, you can use the code below:

    import UIKit
    
    class ViewController: UIViewController {
    
        /* ... */
    
        @IBAction func screenshot(_ sender: UIBarButtonItem) {
            //Create the UIImage
            guard let layer = UIApplication.shared.keyWindow?.layer else { return }
            let renderer = UIGraphicsImageRenderer(size: layer.frame.size)
            let image = renderer.image(actions: { context in
                layer.render(in: context.cgContext)
            })
            
            //Save it to the camera roll
            UIImageWriteToSavedPhotosAlbum(image, nil, nil, nil)
        }
         
    }
    

    Reminder

    Since iOS 10, in order to prevent your app from crashing when calling your screenshot(_:) method, you need to add the key NSPhotoLibraryUsageDescription to your project's Info.plist file:

    <key>NSPhotoLibraryUsageDescription</key>
    <string>Some description to explain why access is required</string>