Screenshot in Swift iOS? Screenshot in Swift iOS? ios ios

Screenshot in Swift iOS?


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 UIKitclass 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 UIKitclass 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 UIKitclass 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 UIKitclass 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>


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;


// Screen shot to share on face book or twitter is like that...

func shareButtonClickedToTwitter(){UIGraphicsBeginImageContextWithOptions(CGSizeMake(320,320), false, 0)var image:UIImage = UIGraphicsGetImageFromCurrentImageContext();self.view?.drawViewHierarchyInRect(CGRectMake(-30, -30, self.frame.size.width, self.frame.size.height), afterScreenUpdates: true)var screenShot  = UIGraphicsGetImageFromCurrentImageContext()UIGraphicsEndImageContext()self.vc.showTWShare("I scored \(score) in Beanystalk can you do better? Available in App Store..", shareImage: screenShot)}func shareButtonClickedToFaceboook() {UIGraphicsBeginImageContextWithOptions(CGSizeMake(320,320), false, 0)var image:UIImage = UIGraphicsGetImageFromCurrentImageContext();self.view?.drawViewHierarchyInRect(CGRectMake(-30, -30, self.frame.size.width, self.frame.size.height), afterScreenUpdates: true)var screenShot  = UIGraphicsGetImageFromCurrentImageContext()UIGraphicsEndImageContext()self.vc.showFbShare("I got \(score) Points whilst playing BeanyStalk! Can you beat me?..", shareImageF: screenShot)  }

// function for facebook share.

    func showFbShare(messageFB: String , shareImageF: UIImage) {  println(messageFB)  if SLComposeViewController.isAvailableForServiceType(SLServiceTypeFacebook){    var fbSheet = SLComposeViewController(forServiceType: SLServiceTypeFacebook)    fbSheet.completionHandler = {      result in      switch result {      case SLComposeViewControllerResult.Cancelled:        break      case SLComposeViewControllerResult.Done:        break      }    }    fbSheet.addImage(shareImageF)    fbSheet.setInitialText("\(messageFB) Click here to fun https://hereIsLink/")    println(messageFB)    self.presentViewController(fbSheet, animated: false, completion: {    })  }  else {    var alert = UIAlertController(title: "Accounts", message: "Please login to a facebook account to share.", preferredStyle: UIAlertControllerStyle.Alert)    alert.addAction(UIAlertAction(title: "OK", style: UIAlertActionStyle.Default, handler: nil))    self.presentViewController(alert, animated: true, completion: nil)  }}

// Twitter Share function

func showTWShare(message: String , shareImage: UIImage) {println(message)if SLComposeViewController.isAvailableForServiceType(SLServiceTypeTwitter){  var twSheet = SLComposeViewController(forServiceType: SLServiceTypeTwitter)  twSheet.completionHandler = {    result in    switch result {    case SLComposeViewControllerResult.Cancelled:      break    case SLComposeViewControllerResult.Done:      break    }  }  twSheet.setInitialText("\(message) Click here 2 fun https://hereIsLink/") //The default text in the tweet  twSheet.addImage(shareImage)  println(message)  self.presentViewController(twSheet, animated: false, completion: {  })}else {  var alert = UIAlertController(title: "Accounts", message: "Please login to a Twitter account to share.", preferredStyle: UIAlertControllerStyle.Alert)  alert.addAction(UIAlertAction(title: "OK", style: UIAlertActionStyle.Default, handler: nil))  self.presentViewController(alert, animated: true, completion: nil)} }