Swift iOS中的屏幕截图?

Swift iOS中的屏幕截图?,ios,iphone,image,swift,screenshot,Ios,Iphone,Image,Swift,Screenshot,如何通过代码(Swift)从屏幕截图并保存它? 我可以拍摄截图并将其保存为图像吗 我已经看过并看到了这段代码,但我不能使用它(我想),因为它什么都不做 var screen = UIScreen.mainScreen() snapshotVieww = screen.snapshotViewAfterScreenUpdates(false) UIGraphicsBeginImageContextWithOptions(screen.bounds.size, false, 0) snapshotV

如何通过代码(Swift)从屏幕截图并保存它? 我可以拍摄截图并将其保存为图像吗

我已经看过并看到了这段代码,但我不能使用它(我想),因为它什么都不做

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)

仅这几行代码就可以获得视图的屏幕截图:(刚刚测试)


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


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

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

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

}
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以来,为了防止调用
屏幕截图(:)
方法时应用程序崩溃,您需要将密钥
NSPhotoLibraryUsageDescription
添加到项目的Info.plist文件中:

<key>NSPhotoLibraryUsageDescription</key>
<string>Some description to explain why access is required</string>
NSPhotoLibraryUsageDescription
解释为什么需要访问的一些说明

//在Facebook或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共享的功能

    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共享功能

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

截图来看,Imanou Petit的回答非常好。我在一个扩展中处理了iOS和tvOS的多个版本,并将其作为一个pod(
pod'SwiftImageEffects'
)提供

完整代码如下(从):

然后,您可以简单地截图如下:

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

在“@iAction func屏幕(发件人:UIButton)”上尝试绘制snapshotVieww…时,在何处/何时调用该代码。。。?N描述关于snapshotVieww?以及如何/何时显示新制作的imageview?是否有办法提高所拍摄图像的质量?@Nicholas此代码未考虑比例因子,因此它在视网膜显示中创建像素化图像。替换为:
UIGraphicsBeginImageContextWithOptions(view.frame.size,false,UIScreen.mainScreen().scale)
如果要保存到照片,还需要
隐私-照片库添加使用说明
albums@ThihaAung你有没有找到在截图中加入状态栏的方法?有没有人知道如何解决这个问题..只在iOS13中面对这个问题。你知道iOS13@IosDeveloper中的这个问题吗?我在iOS13中遇到了类似的问题。不支持使用此方法或类似方法(如[NSString drawInRect:options:])渲染的文本visible@humblePilgrim我已经更新了工作代码,你可以查看下面的链接,这很酷。但是,如果我在屏幕上显示任何弹出窗口或模态,当我使用这些代码时,这些模态周围会出现奇怪的浓密阴影,有什么办法可以解决吗?@zaitsman我不知道你的视图层次结构如何。尝试
renderImage()
使用不同的窗口或视图。如果你不能解决这个问题,那么可以针对这些阴影问一个特定的堆栈溢出问题。