tus - Captura de pantalla en Swift iOS?
subir aplicacion a ios (4)
// La captura de pantalla para compartir en Facebook o Twitter es así ...
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) }
// función para compartir en 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 Share 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)
} }
¿Cómo puedo tomar una captura de pantalla de mi pantalla por código (en Swift) y guardarla? ¿Puedo tomar una captura de pantalla y guardarla como imagen?
He mirado y veo este código, pero no puedo usarlo (creo) porque no hace nada.
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)
Con Swift 4 / iOS 10.3, puede elegir una de las siguientes formas para resolver su problema.
1. Tome una captura de pantalla de la vista de un controlador de vista
El siguiente código muestra cómo tomar una captura de pantalla y guardarla en el álbum de fotos del dispositivo:
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)
}
}
Tenga en cuenta que el resultado de este código será una imagen .JPG. También tenga en cuenta que la barra de navegación y la barra de estado no aparecerán en la imagen final.
Desde iOS 10, como alternativa al código anterior, puedes usar el siguiente código:
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. Tome una captura de pantalla de una ventana de iPhone
Si desea tomar una captura de pantalla que incluya la barra de navegación (pero no la barra de estado), puede usar el siguiente código:
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)
}
}
Desde iOS 10, como alternativa al código anterior, puedes usar el siguiente código:
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)
}
}
Recordatorio
Desde iOS 10, para evitar que su aplicación se bloquee al llamar a su método de screenshot(_:)
, debe agregar la clave NSPhotoLibraryUsageDescription
al archivo NSPhotoLibraryUsageDescription
de su proyecto:
<key>NSPhotoLibraryUsageDescription</key>
<string>Some description to explain why access is required</string>
Para tomar una captura de pantalla, la respuesta de Imanou Petit es muy buena. He tratado con las múltiples versiones de iOS y tvOS en una sola extensión, y lo he hecho disponible como un pod ( pod ''SwiftImageEffects''
).
Código completo a continuación (de https://github.com/Coeur/ImageEffects/blob/master/SwiftImageEffects/ImageEffects%2Bextensions.swift ):
extension UIView {
/// Get a UIImage from the UIView
/// - parameter opaque:
/// A Boolean flag indicating whether the image is opaque. Specify true to ignore the alpha channel. Specify false to handle any partially transparent pixels.
/// - parameter scale:
/// The scale factor to apply to the image. If you specify a value of 0.0, the scale factor is set to the scale factor of the device’s main screen.
open func renderImage(opaque: Bool = false, scale: CGFloat = 0) -> UIImage {
if #available(iOS 10.0, tvOS 10.0, *) {
let format = UIGraphicsImageRendererFormat.default()
format.opaque = opaque
format.scale = scale
return UIGraphicsImageRenderer(size: bounds.size, format: format).image { layer.render(in: $0.cgContext) }
} else {
// Fallback on earlier versions
// The following methods will only return a 8-bit per channel context in the DeviceRGB color space.
// Any new bitmap drawing code is encouraged to use UIGraphicsImageRenderer in lieu of this API.
UIGraphicsBeginImageContextWithOptions(bounds.size, opaque, scale)
defer { UIGraphicsEndImageContext() }
layer.render(in: UIGraphicsGetCurrentContext()!)
return UIGraphicsGetImageFromCurrentImageContext()!
}
}
}
Entonces puede tomar una captura de pantalla tan simple como:
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)
}
}
Solo estas pocas líneas de código obtendrán la captura de pantalla de la vista: (solo probado)
UIGraphicsBeginImageContextWithOptions(UIScreen.mainScreen().bounds.size, false, 0);
self.view.drawViewHierarchyInRect(view.bounds, afterScreenUpdates: true)
var image:UIImage = UIGraphicsGetImageFromCurrentImageContext();
UIGraphicsEndImageContext();
self.imgView.image = image;