使用 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)
}
}
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(_:)方法时崩溃,你需要在项目的Info.plist文件中添加键NSPhotoLibraryUsageDescription:
<key>NSPhotoLibraryUsageDescription</key>
<string>Some description to explain why access is required</string>