Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

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) 
like image 706
Giorgio Nocera Avatar asked Aug 22 '14 10:08

Giorgio Nocera


People also ask

How do I turn off screen capture IOS?

To do so, open “Settings” and navigate to “Display and Brightness.” Swipe down, and then toggle-Off the “Raise to Wake” option. Once this is disabled, your device will no longer wake when you lift it, so it won't be able to take as many accidental screenshots.

How do you screenshot a Mac?

How to take a screenshot on your Mac. To take a screenshot, press and hold these three keys together: Shift, Command, and 3. If you see a thumbnail in the corner of your screen, click it to edit the screenshot.


Video Answer


2 Answers

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> 
like image 56
Imanou Petit Avatar answered Sep 20 '22 17:09

Imanou Petit


Just these few lines of code will get the screenShot of the View :(just Tested)

  UIGraphicsBeginImageContextWithOptions(UIScreen.mainScreen().bounds.size, false, 0);   self.view.drawViewHierarchyInRect(view.bounds, afterScreenUpdates: true)   var image:UIImage = UIGraphicsGetImageFromCurrentImageContext();    UIGraphicsEndImageContext();    self.imgView.image = image; 
like image 32
Kumar KL Avatar answered Sep 21 '22 17:09

Kumar KL