Swift iOS中的屏幕截图?
如何通过代码(Swift)从屏幕截图并保存它? 我可以拍摄截图并将其保存为图像吗 我已经看过并看到了这段代码,但我不能使用它(我想),因为它什么都不做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
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()
使用不同的窗口或视图。如果你不能解决这个问题,那么可以针对这些阴影问一个特定的堆栈溢出问题。