在Swift 4 / iOS 10.3中,您可以选择以下其中一种方法来解决您的问题。
1. 对视图控制器的视图进行截图
以下代码显示了如何获取屏幕截图并将其保存在设备的照片相册中:
import UIKit
class ViewController: UIViewController {
@IBAction func screenshot(_ sender: UIBarButtonItem) {
UIGraphicsBeginImageContextWithOptions(view.frame.size, true, 0)
guard let context = UIGraphicsGetCurrentContext() else { return }
view.layer.render(in: context)
guard let image = UIGraphicsGetImageFromCurrentImageContext() else { return }
UIGraphicsEndImageContext()
UIImageWriteToSavedPhotosAlbum(image, nil, nil, nil)
}
}
请注意,此代码的结果将是一个 .JPG 图像。另外,请注意最终图像中不会出现导航栏和状态栏。
自 iOS 10 开始,作为先前代码的替代方案,您可以使用下面的代码:
import UIKit
class ViewController: UIViewController {
@IBAction func screenshot(_ sender: UIBarButtonItem) {
let renderer = UIGraphicsImageRenderer(size: view.frame.size)
let image = renderer.image(actions: { context in
view.layer.render(in: context.cgContext)
})
UIImageWriteToSavedPhotosAlbum(image, nil, nil, nil)
}
}
2. 拍摄 iPhone 窗口截图
如果您想拍摄包含导航栏(但不包括状态栏)的截图,您可以使用以下代码:
import UIKit
class ViewController: UIViewController {
@IBAction func screenshot(_ sender: UIBarButtonItem) {
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()
UIImageWriteToSavedPhotosAlbum(image, nil, nil, nil)
}
}
iOS 10以后,作为之前代码的替代方案,您可以使用以下代码:
import UIKit
class ViewController: UIViewController {
@IBAction func screenshot(_ sender: UIBarButtonItem) {
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)
})
UIImageWriteToSavedPhotosAlbum(image, nil, nil, nil)
}
}
提醒
自iOS 10以来,为了防止在调用screenshot(_:)
方法时导致应用程序崩溃,您需要将键NSPhotoLibraryUsageDescription
添加到项目的Info.plist文件中:
<key>NSPhotoLibraryUsageDescription</key>
<string>Some description to explain why access is required</string>