在swift iOS中的屏幕截图?

有谁知道我怎么可以从我的屏幕截图通过代码(在迅速),并保存它? 我可以截图并保存为图像吗?

我看了,我看到这个代码,但我不能使用它(我认为),因为它什么都不做。

var screen:UIScreen = 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) 

先谢谢你!

使用Swift 4 / iOS 10.3,您可以select以下方法之一来解决您的问题。


1.截取视图控制器的视图

以下代码显示如何截取屏幕截图并将其保存在设备相册中:

 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) } } 

请注意,此代码的结果将是一个.JPG图像。 另请注意,导航栏和状态栏不会出现在最终的图像中。

自iOS 10以来,作为以前代码的替代品,您可以使用下面的代码:

 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.截取一个iPhone窗口

如果你想截图,包括导航栏(但不是状态栏),您可以使用下面的代码:

 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) } } 

自iOS 10以来,作为以前代码的替代品,您可以使用下面的代码:

 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) } } 

提醒

从iOS 10开始,为了防止在调用screenshot(_:)方法时应用程序崩溃,需要将NSPhotoLibraryUsageDescriptionNSPhotoLibraryUsageDescription到项目的Info.plist文件中:

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

只要这几行代码就会得到视图的屏幕截图:(刚刚testing过)

  UIGraphicsBeginImageContextWithOptions(UIScreen.mainScreen().bounds.size, false, 0); self.view.drawViewHierarchyInRect(view.bounds, afterScreenUpdates: true) var image:UIImage = UIGraphicsGetImageFromCurrentImageContext(); UIGraphicsEndImageContext(); self.imgView.image = image; 

//在脸书或Twitter上分享的屏幕截图就像…

 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) } 

//为Facebook分享function

  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分享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) } }