![]() |
Screenshot in Swift iOS? - Printable Version +- 0Day Forums (https://0day.red) +-- Forum: Coding (https://0day.red/Forum-Coding) +--- Forum: Swift (https://0day.red/Forum-Swift) +--- Thread: Screenshot in Swift iOS? (/Thread-Screenshot-in-Swift-iOS) |
Screenshot in Swift iOS? - Siramandivpfy - 07-19-2023 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) RE: Screenshot in Swift iOS? - winslow382072 - 07-19-2023 To take a screenshot, Imanou Petit answer is very good. I've dealt with the multiple versions of iOS and tvOS in a single extension, and made it available as a pod (`pod 'SwiftImageEffects'`). Full code below (from [To see links please register here] ):extension UIView { /// Get a UIImage from the UIView /// - parameter opaque: /// A Boolean flag indicating whether the image is opaque. Specify true to ignore the alpha channel. Specify false to handle any partially transparent pixels. /// - parameter scale: /// The scale factor to apply to the image. If you specify a value of 0.0, the scale factor is set to the scale factor of the device’s main screen. open func renderImage(opaque: Bool = false, scale: CGFloat = 0) -> UIImage { if #available(iOS 10.0, tvOS 10.0, *) { let format = UIGraphicsImageRendererFormat.default() format.opaque = opaque format.scale = scale return UIGraphicsImageRenderer(size: bounds.size, format: format).image { layer.render(in: $0.cgContext) } } else { // Fallback on earlier versions // The following methods will only return a 8-bit per channel context in the DeviceRGB color space. // Any new bitmap drawing code is encouraged to use UIGraphicsImageRenderer in lieu of this API. UIGraphicsBeginImageContextWithOptions(bounds.size, opaque, scale) defer { UIGraphicsEndImageContext() } layer.render(in: UIGraphicsGetCurrentContext()!) return UIGraphicsGetImageFromCurrentImageContext()! } } } Then you may take a screenshot as simply as: func screenshot() { if let image = UIApplication.shared.keyWindow?.renderImage() { // saving will require a NSPhotoLibraryUsageDescription in your project's Info.plist UIImageWriteToSavedPhotosAlbum(image, nil, nil, nil) } } RE: Screenshot in Swift iOS? - secundogeniture672456 - 07-19-2023 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> RE: Screenshot in Swift iOS? - yardleymnunl - 07-19-2023 // 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 [To see links please register here] )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 [To see links please register here] ) //The default text in the tweettwSheet.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) } } RE: Screenshot in Swift iOS? - trady374872 - 07-19-2023 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; |