Comment convertir un UIView en image

94

Je souhaite convertir un UIView en image et l'enregistrer dans mon application. Quelqu'un peut-il me dire comment prendre une capture d'écran d'une vue ou la convertir en image et quelle est la meilleure façon de l'enregistrer dans une application (pas de pellicule)? Voici le code de la vue:

var overView   = UIView(frame: CGRectMake(0, 0, self.view.frame.width/1.3, self.view.frame.height/1.3))
overView.center = CGPointMake(CGRectGetMidX(self.view.bounds),
CGRectGetMidY(self.view.bounds)-self.view.frame.height/16);
overView.backgroundColor = UIColor.whiteColor()
self.view.addSubview(overView)
self.view.bringSubviewToFront(overView)
Sameer Hussain
la source
Aussi pertinent: stackoverflow.com/q/59592933/294884
Fattie

Réponses:

189

Une extension sur UIViewdevrait faire l'affaire.

extension UIView {

    // Using a function since `var image` might conflict with an existing variable
    // (like on `UIImageView`)
    func asImage() -> UIImage {
        let renderer = UIGraphicsImageRenderer(bounds: bounds)
        return renderer.image { rendererContext in
            layer.render(in: rendererContext.cgContext)
        }
    }
}

Apple déconseille d'utiliser le UIGraphicsBeginImageContextdémarrage d'iOS 10 avec l'introduction de la gamme de couleurs P3. UIGraphicsBeginImageContextest sRGB et 32 ​​bits uniquement. Ils ont introduit la nouvelle UIGraphicsImageRendererAPI entièrement gérée par couleur, basée sur des blocs, comportant des sous-classes pour les PDF et les images, et gérant automatiquement la durée de vie du contexte. Consultez la session 205 de la WWDC16 pour plus de détails (le rendu de l'image commence vers 11:50)

Pour être sûr que cela fonctionne sur tous les appareils, utilisez #availableavec un retour aux versions antérieures d'iOS:

extension UIView {

    // Using a function since `var image` might conflict with an existing variable
    // (like on `UIImageView`)
    func asImage() -> UIImage {
        if #available(iOS 10.0, *) {
            let renderer = UIGraphicsImageRenderer(bounds: bounds)
            return renderer.image { rendererContext in
                layer.render(in: rendererContext.cgContext)
            }
        } else {
            UIGraphicsBeginImageContext(self.frame.size)
            self.layer.render(in:UIGraphicsGetCurrentContext()!)
            let image = UIGraphicsGetImageFromCurrentImageContext()
            UIGraphicsEndImageContext()
            return UIImage(cgImage: image!.cgImage!)
        }
    }
}
Naveed J.
la source
9
Cela devrait être marqué comme la bonne réponse. Toutes les autres options entraîneront une perte de clarté de l'image rendue et un aspect pixélisé / flou.
TuplingD
La seule bonne façon! Pour les débutants, l'utilisation est: let image = customView.asImage ()
Fabio
1
Est-il possible de rendre l'UIView avec un fond transparent? Le mien a des coins arrondis.
ixany
@ixany Cela devrait déjà s'en occuper. Je viens de l'essayer avec ce qui suit dans un terrain de jeu et cela a fonctionné: let view = UIView(frame: CGRect(x: 0, y: 0, width: 100, height: 100)); view.backgroundColor = .black; view.layer.cornerRadius = 9; view.asImage();
Naveed J.
2
Je vous remercie! Si quelqu'un sait, je serais curieux de savoir quelles différences il y a avec le code de hackingwithswift.com/example-code/media/… : return renderer.image {ctx in drawHierarchy (in: bounds, afterScreenUpdates: true)}
Kqtr
63

vous pouvez utiliser l'extension

extension UIImage {
    convenience init(view: UIView) {
        UIGraphicsBeginImageContext(view.frame.size)
        view.layer.render(in:UIGraphicsGetCurrentContext()!)
        let image = UIGraphicsGetImageFromCurrentImageContext()
        UIGraphicsEndImageContext()
        self.init(cgImage: image!.cgImage!)
    }
}

Voici la version Swift 3/4:

extension UIImage {
    convenience init(view: UIView) {
        UIGraphicsBeginImageContext(view.frame.size)
        view.layer.render(in:UIGraphicsGetCurrentContext()!)
        let image = UIGraphicsGetImageFromCurrentImageContext()
        UIGraphicsEndImageContext()
        self.init(cgImage: image!.cgImage!)
    }
}
Bao Tuan Diep
la source
5
Je suis gêné d'être celui qui demande ça, mais comment appeler ça? Je n'ai pas d'image et un UIView que je veux être une image. Le code ci-dessus me donne une extension UIImage ... mais maintenant quoi?
Dave G
8
let image = UIImage(view: myView)
doctorBroctor
Cela ne fonctionne pas pour moi car UIGraphicsGetCurrentContext () peut être nul et le code plante.
Juan Carlos Ospina Gonzalez
@JuanCarlosOspinaGonzalez Si UIGraphicsGetCurrentContext a renvoyé nil, je suppose que vous devez vérifier UIGraphicsBeginImageContext pour comprendre pourquoi il a échoué. Je suppose que l'une des dimensions de votre taille est nulle ou non valide, mais je n'ai aucune idée de ce qui pourrait vraiment faire échouer cela.
John Stephen
2
vous devez également garder à l'esprit l'échelle de l'écran, donc je remplacerais la première ligne de l'initialiseur par ceci: UIGraphicsBeginImageContextWithOptions(view.frame.size, false, UIScreen.main.scale)
iVentis
41

Convertissez votre UIView en image par drawViewHierarchyInRect: afterScreenUpdates: qui est plusieurs fois plus rapide que renderInContext

Remarque importante: n'appelez pas cette fonction depuis viewDidLoad ou viewWillAppear , assurez-vous que vous capturez une vue après son affichage / chargement complet

Obj C

     UIGraphicsBeginImageContextWithOptions(myView.bounds.size, myView.opaque, 0.0f);
     [myView drawViewHierarchyInRect:myView.bounds afterScreenUpdates:NO];
     UIImage *snapshotImageFromMyView = UIGraphicsGetImageFromCurrentImageContext();
     UIGraphicsEndImageContext();

     myImageView.image =  snapshotImageFromMyView;

Enregistrer l'image modifiée Album photo

     UIImageWriteToSavedPhotosAlbum(snapshotImageFromMyView, nil,nil, nil);

Swift 3/4

    UIGraphicsBeginImageContextWithOptions(myView.bounds.size, myView.isOpaque, 0.0)
    myView.drawHierarchy(in: myView.bounds, afterScreenUpdates: false)
    let snapshotImageFromMyView = UIGraphicsGetImageFromCurrentImageContext()
    UIGraphicsEndImageContext()
    print(snapshotImageFromMyView)
    myImageView.image = snapshotImageFromMyView

Généralisation super facile avec extension, iOS11, swift3 / 4

extension UIImage{
    convenience init(view: UIView) {

    UIGraphicsBeginImageContextWithOptions(view.bounds.size, view.isOpaque, 0.0)
    view.drawHierarchy(in: view.bounds, afterScreenUpdates: false)
    let image = UIGraphicsGetImageFromCurrentImageContext()
    UIGraphicsEndImageContext()
    self.init(cgImage: (image?.cgImage)!)

  }
}


Use : 
 //myView is completly loaded/visible , calling this code after only after viewDidAppear is call
 imgVV.image = UIImage.init(view: myView)
 // Simple image object
 let img =  UIImage.init(view: myView)
ViJay Avhad
la source
3
Pas de travail pour moi, j'ai un écran noir pour mon UiImage
Badr Filali
Vraiment ?? Pouvez-vous coller votre code ici. Vous utilisez peut-être un objet UIView incorrect à convertir en UIImage.
ViJay Avhad le
`func convertViewIntoImg () -> Void {imgFakeCard.image = UIImage.init (view: card)}` Avec votre extension dans swift 3, cette fonction est appelée dans viewDidLoad
Badr Filali
1
Merci d'avoir posté votre code et d'avoir mentionné que vous avez appelé viewDidLoad. Voici ce que vous avez mal fait. Vous capturez un instantané de la vue avant son chargement en mémoire. Veuillez essayer d'appeler le code dans viewDidAppear, cela résoudra le problème à coup sûr. Toute question s'il vous plaît répondre.
ViJay Avhad
Ce travail est grand merci, le problème vient de l'endroit où j'ai appelé votre extension
Badr Filali
20

Sur iOS 10:

extension UIImage {
    convenience init(view: UIView) {
        UIGraphicsBeginImageContext(view.frame.size)
        view.layer.render(in: UIGraphicsGetCurrentContext()!)
        let image = UIGraphicsGetImageFromCurrentImageContext()
        UIGraphicsEndImageContext()
        self.init(cgImage: (image?.cgImage)!)
    }
}
afrodev
la source
1
cela conduit à des plantages.
KingPolygon
18

Meilleures pratiques à partir d'iOS 10 et de Swift 3

tout en prenant en charge iOS 9 et les versions antérieures fonctionnent toujours à partir d'iOS 13, Xcode 11.1, Swift 5.1

extension UIView {

    func asImage() -> UIImage? {
        if #available(iOS 10.0, *) {
            let renderer = UIGraphicsImageRenderer(bounds: bounds)
            return renderer.image { rendererContext in
                layer.render(in: rendererContext.cgContext)
            }
        } else {
            UIGraphicsBeginImageContextWithOptions(self.bounds.size, self.isOpaque, 0.0)
            defer { UIGraphicsEndImageContext() }
            guard let currentContext = UIGraphicsGetCurrentContext() else {
                return nil
            }
            self.layer.render(in: currentContext)
            return UIGraphicsGetImageFromCurrentImageContext()
        }
    }
}

Je ne sais pas ce que signifie la question par:

quelle est la meilleure façon de l'enregistrer dans une application (pas de pellicule)?

Jon Willis
la source
17
    UIGraphicsBeginImageContext(self.view.bounds.size);        
    self.view.layer.renderInContext(UIGraphicsGetCurrentContext())
    var screenShot = UIGraphicsGetImageFromCurrentImageContext();
    UIGraphicsEndImageContext();
Vakas
la source
1
UIGraphicsGetImageFromCurrentImageContext renvoie UIImage. Pas besoin de le diffuser sur UIImage
Leo Dabus
Cela prend une capture d'écran de la vue entière, oui? Je veux juste convertir un aperçu UIView ie dans mon code qui est une sous-vue de self.view en une image. Pas la vue entière!
Sameer Hussain
@Vakas quand j'ai essayé d'imprimer image.it affiche trop petit.ce qui est la solution pour cela
Krutarth Patel
6
L'image de la capture d'écran n'est pas de bonne qualité, que dois-je faire?
Neela
13

Par exemple si j'ai une vue de taille: 50 50 à 100,100. Je peux utiliser ce qui suit pour prendre une capture d'écran:

    UIGraphicsBeginImageContextWithOptions(CGSizeMake(100, 100), false, 0);
    self.view.drawViewHierarchyInRect(CGRectMake(-50,-5-,view.bounds.size.width,view.bounds.size.height), afterScreenUpdates: true)
    var image:UIImage = UIGraphicsGetImageFromCurrentImageContext();
Sameer Hussain
la source
dans la ligne self.view, il y a une erreur dans parameter.i pense que cela devrait être -5 et non -5-
Krutarth Patel
@sameer j'ai une question.Lorsque j'imprime cette image, elle est trop petite
Krutarth Patel
7

À mon avis, l'approche avec l'initialiseur n'est pas terrible car elle crée deux images.

Je préfère ça:

extension UIView {
    var snapshot: UIImage? {
        UIGraphicsBeginImageContext(self.frame.size)
        guard let context = UIGraphicsGetCurrentContext() else {
            return nil
        }
        layer.render(in: context)
        let image = UIGraphicsGetImageFromCurrentImageContext()
        UIGraphicsEndImageContext()
        return image
    }
}
Tino
la source
Vous devez appeler la propriété autre chose que image. Cela peut interférer avec les sous-classes qui ont des propriétés appelées image, telles que UIImageView.
Hobbes the Tige
A suivi la suggestion de @HobbestheTige et renommé la propriété
Tino
6

Swift 4.2, iOS 10

extension UIView {

    // If Swift version is lower than 4.2, 
    // You should change the name. (ex. var renderedImage: UIImage?)

    var image: UIImage? {
        let renderer = UIGraphicsImageRenderer(bounds: bounds)
        return renderer.image { rendererContext in layer.render(in: rendererContext.cgContext) }
    }
}

Échantillon

let view = UIView(frame: CGRect(x: 0, y: 0, width: 100, height: 100))
view.backgroundColor = .blue

let view2 = UIView(frame: CGRect(x: 10, y: 10, width: 20, height: 20))
view2.backgroundColor = .red
view.addSubview(view2)

let imageView = UIImageView(image: view.image)

entrez la description de l'image ici

Tanière
la source
Je voulais juste souligner que cela doit être nommé autre chose si vous utilisez des UIImageViews dans votre projet, sinon .image devient en lecture seule. Peut-être l'appeler «screenCapture» au lieu de «image».
Chris le
@Chris Ouais, tu as raison. Vous devez changer un nom si la version Swift est inférieure à 4.2. Merci d'avoir signalé l'erreur.
Den
6

Cela fonctionne pour moi pour Xcode 9 / Swift 3.2 / Swift 4 et Xcode 8 / Swift 3

 if #available(iOS 10.0, *) {

     // for Xcode 9/Swift 3.2/Swift 4 -Paul Hudson's code
     let renderer = UIGraphicsImageRenderer(size: view!.bounds.size)
     let capturedImage = renderer.image { 
         (ctx) in
         view!.drawHierarchy(in: view!.bounds, afterScreenUpdates: true)
     }
     return capturedImage

 } else {

     // for Xcode 8/Swift 3
     UIGraphicsBeginImageContextWithOptions((view!.bounds.size), view!.isOpaque, 0.0)
     view!.drawHierarchy(in: view!.bounds, afterScreenUpdates: false)
     let capturedImage = UIGraphicsGetImageFromCurrentImageContext()
     UIGraphicsEndImageContext()
     return capturedImage!
 }

Voici comment l'utiliser dans une fonction:

fileprivate func captureUIImageFromUIView(_ view:UIView?) -> UIImage {

     guard (view != nil) else{

        // if the view is nil (it's happened to me) return an alternative image
        let errorImage = UIImage(named: "Error Image")
        return errorImage
     }

     // if the view is all good then convert the image inside the view to a uiimage
     if #available(iOS 10.0, *) {

         let renderer = UIGraphicsImageRenderer(size: view!.bounds.size)
         let capturedImage = renderer.image { 
             (ctx) in
             view!.drawHierarchy(in: view!.bounds, afterScreenUpdates: true)
         }
         return capturedImage

     } else {

         UIGraphicsBeginImageContextWithOptions((view!.bounds.size), view!.isOpaque, 0.0)
         view!.drawHierarchy(in: view!.bounds, afterScreenUpdates: false)
         let capturedImage = UIGraphicsGetImageFromCurrentImageContext()
         UIGraphicsEndImageContext()
         return capturedImage!
     }
}

Voici comment faire quelque chose avec l'image renvoyée par la fonction:

@IBOutlet weak fileprivate var myCustomView: UIView!
var myPic: UIImage?

let myImageView = UIImageView()

@IBAction fileprivate func saveImageButtonTapped(_ sender: UIButton) {

   myPic = captureUIImageFromUIView(myCustomView)

   // display the pic inside a UIImageView
   myImageView.image = myPic!
}

J'ai eu la réponse Xcode 9 / Swift 3.2 / Swift 4 de Paul Hudson convertir uiview en uiimage

J'ai eu le Xcode 8 / Swift 3 de quelque part il y a si longtemps et j'ai oublié où :(

Lance Samaria
la source
Où l'image est-elle également affichée et / ou enregistrée?
Famic Tech
@FamicTech une fois l'image créée, c'est aux jeunes de décider quoi en faire. Dans l'exemple de mon code, je viens de convertir l'UIView en une UIImage nommée "myPic" mais je n'ai rien fait avec "myPic". La prochaine étape possible consiste à afficher «myPic» dans un UIImageVIew comme ceci: myImageVIew.image = myPic. Si vous utilisez un collectionView et que vous vouliez y afficher des images, vous créez un UIImageVIew dans chaque cellule, puis affichez l'image (myPic) dans UIImageVIew via le indexPath.item de la source de données ex: myImageView.image = dataSource [indexPath .item] .myPic
Lance Samaria
@FamicTech Vous faites une petite erreur. Cela n'a rien à voir avec une collectionVIew. Vous avez 2 types de classes différents: UIImage et un UIView. Les deux peuvent être utilisés pour afficher n'importe quelle image, mais ils le font tous deux de différentes manières. Presque tout dans iOS est une sous-classe d'un UIView mais une UIImage ne peut afficher que des images (2 choses différentes). Cette fonction prend le UIVIew et le convertit en UIImage. Un exemple plus facile. Si vous voulez convertir 4.0 (un Double) en 4 (un Int), vous le transtypez Int (4.0), le résultat est 4. Mais avec cela, vous convertissez l'image à l'intérieur de l'UIVIew en UIImage. Comprendre?
Lance Samaria
ce que j'essaie de faire, c'est que l'utilisateur accède à mon contrôleur de vue de collection et appuie sur un bouton qui devrait prendre la vue actuelle, qui se trouve être une vue de collection 10x10 et créer une image de la grille 10x10 entière (veuillez noter que l'ensemble la grille n'est pas entièrement visible). Votre code ci-dessus résout-il ce cas d'utilisation?
Famic Tech
Le bouton se trouve dans le contrôleur de navigation. L'utilisateur cliquera dessus et il `` devrait '' prendre la vue de collection affichée sous le contrôleur de navigation et créer une image de la vue de collection (un PDF fonctionnerait également) avec toutes les informations dans les cellules de la vue de collection.
Famic Tech
5
var snapshot = overView.snapshotViewAfterScreenUpdates(false)

ou en objectif-c

UIView* snapshot = [overView snapshotViewAfterScreenUpdates:NO];
Yedidya Reiss
la source
ImageView est-il identique à image? Si oui, comment puis-je l'enregistrer dans mon application?
Sameer Hussain
4

Vous pouvez l'utiliser facilement en utilisant l'extension comme celle-ci

// Take a snapshot from a view (just one view)
let viewSnapshot = myView.snapshot

// Take a screenshot (with every views in screen)
let screenSnapshot = UIApplication.shared.snapshot

// Take a snapshot from UIImage initialization
UIImage(view: self.view)

Si vous souhaitez utiliser ces méthodes / variables d'extension, implémentez ceci

  1. Extension UIImage

    extension UIImage {
        convenience init(view: UIView) {
            if let cgImage = view.snapshot?.cgImage {
                self.init(cgImage: cgImage)
            } else {
                self.init()
            }
        }
    }
  2. Extension UIView

    extension UIView {
    
        var snapshot: UIImage? {
            UIGraphicsBeginImageContextWithOptions(bounds.size, isOpaque, 0.0)
            if UIGraphicsGetCurrentContext() != nil {
                drawHierarchy(in: bounds, afterScreenUpdates: true)
                let screenshot = UIGraphicsGetImageFromCurrentImageContext()
                UIGraphicsEndImageContext()
                return screenshot
            }
            return nil
        }
    }
  3. Extension UIApplication

    extension UIApplication {
    
        var snapshot: UIImage? {
            return keyWindow?.rootViewController?.view.snapshot
        }
    }
Khemmachart Chutapetch
la source
J'ai eu une vue avec des sous-vues zPositions manipulées, et d'autres réponses ne m'ont pas donné les positions correctes des calques, merci.
Ashkan Ghodrat
3

ou iOS 10+, vous pouvez utiliser le nouveau UIGraphicsImageRenderer + le drawHierarchy recommandé, qui dans certaines situations peut être beaucoup plus rapide que layer.renderInContext

extension UIView {
    func asImage() -> UIImage {
        let renderer = UIGraphicsImageRenderer(size: self.bounds.size)
        return renderer.image { _ in
            self.drawHierarchy(in: CGRect(x: 0, y: 0, width: bounds.size.width, height: bounds.size.height), afterScreenUpdates: false)
        }
    }
}
Морт
la source
3

Merci @Bao Tuan Diep! Je veux ajouter un supplément.

Lorsque vous utilisez le code:

yourView.layer.render(in:UIGraphicsGetCurrentContext()!)

Vous devez remarquer que:

 - If you had used `autoLayout` or `Masonry` in `yourView` (that you want to convert) .
 - If you did not add `yourView` to another view which means that `yourView` was not used as a subview but just an object.

Ensuite, vous devez utiliser :

[yourView setNeedsLayout];
[yourView layoutIfNeeded];

mettre à jour yourViewavantyourView.layer.render(in:UIGraphicsGetCurrentContext()!) .

Sinon, vous risquez d'obtenir un objet image qui ne contient aucun élément

guozqzzu
la source
Merci pour cela. J'ai beaucoup aidé !!
Maksim Kniazev le
2

Swift 4.2

import Foundation
import UIKit  

extension UIImage {

    convenience init(view: UIView) {

        UIGraphicsBeginImageContextWithOptions(view.bounds.size, view.isOpaque, 0.0)
        view.drawHierarchy(in: view.bounds, afterScreenUpdates: false)
        let image = UIGraphicsGetImageFromCurrentImageContext()
        UIGraphicsEndImageContext()
        self.init(cgImage: (image?.cgImage)!)

    } 
}

en utilisant:

laissez img = UIImage.init (vue: self.holderView)

reza_khalafi
la source
1

Implémentation dans Swift 3 :

Ajoutez le code ci-dessous, hors de la portée de la classe.

extension UIImage {
    convenience init(_ view: UIView) {
        UIGraphicsBeginImageContext(view.frame.size)
        view.layer.render(in: UIGraphicsGetCurrentContext()!)
        let image = UIGraphicsGetImageFromCurrentImageContext()
        UIGraphicsEndImageContext()
        self.init(cgImage: (image?.cgImage)!)
    }
}

Utilisation:

let image = UIImage( Your_View_Outlet )
roy
la source
obtenir l'erreur "Dessiner une vue (0x1040a6970, UIView) qui n'a pas été rendue au moins une fois nécessite"
kishu mewara
0

J'ai implémenté @Naveed J. comme ça, et ça a fonctionné comme un charme.

Voici son extension:

extension UIView {

    // Using a function since `var image` might conflict with an existing variable
    // (like on `UIImageView`)
    func asImage() -> UIImage {
        let renderer = UIGraphicsImageRenderer(bounds: bounds)
        return renderer.image { rendererContext in
            layer.render(in: rendererContext.cgContext)
        }
    }
}

Voici comment je l'ai implémenté.

//create an image from yourView to display
//determine the frame of the view/imageimage
let screen = self.superview!.bounds
let width = screen.width / 4 //make image 1/4 width of screen
let height = width
let frame = CGRect(x: 0, y: 0, width: width, height: height)
let x = (screen.size.width - frame.size.width) * 0.5
let y = (screen.size.height - frame.size.height) * 0.5
let mainFrame = CGRect(x: x, y: y, width: frame.size.width, height: frame.size.height)

let yourView = YourView() //instantiate yourView
yourView.frame = mainFrame //give it the frame
yourView.setNeedsDisplay() //tell it to display (I am not 100% sure this is needed)

let characterViewImage = yourView.asImage()
Jacob F. Davis C-CISO
la source
0

Initialiseur avec le nouveau UIGraphicsImageRenderer disponible depuis iOS 10:

extension UIImage{
    convenience init(view: UIView) {

    let renderer = UIGraphicsImageRenderer(size: self.bounds.size)
    let canvas = CGRect(x: 0, y: 0, width: bounds.size.width, height: bounds.size.height)
    let image = renderer.image { _ in
        self.drawHierarchy(in: canvas, afterScreenUpdates: false)
    }
    self.init(cgImage: (image?.cgImage)!)
  }
}
Frédéric Adda
la source
0

fonctionne bien avec moi!

Swift4

 extension UIView {

    func toImage() -> UIImage {
        UIGraphicsBeginImageContextWithOptions(self.bounds.size, self.isOpaque, 0.0)
        self.drawHierarchy(in: self.bounds, afterScreenUpdates: false)
        let snapshotImageFromMyView = UIGraphicsGetImageFromCurrentImageContext()
        UIGraphicsEndImageContext()
        return snapshotImageFromMyView!
    }

    }
Faris
la source
return snapshotImageFromMyView!Thread 1: Erreur fatale: trouvé nul de manière inattendue lors du déballage d'une valeur facultative
Takasur
0

Pour la vue contient une sous-vue floue (par exemple, l'instance UIVisualEffectView ), uniquement drawViewHierarchyInRect: afterScreenUpdates fonctionne.

La réponse de @ViJay Avhad est correcte pour ce cas.

rafalkitta
la source
0

L'utilisation de UIGraphicsImageRenderer ne fonctionne pas lorsque la vue contient des sous-vues Scene Kit, Metal ou Sprite Kit. Dans ces cas, utilisez

let renderer = UIGraphicsImageRenderer(size: view.bounds.size)
let image = renderer.image { ctx in
    view.drawHierarchy(in: view.bounds, afterScreenUpdates: true)
}
johnnyMac
la source
-1
please try below code.
-(UIImage *)getMainImageFromContext
{
UIGraphicsBeginImageContextWithOptions(viewBG.bounds.size, viewBG.opaque, 0.0);
[viewBG.layer renderInContext:UIGraphicsGetCurrentContext()];
UIImage * img = UIGraphicsGetImageFromCurrentImageContext();
UIGraphicsEndImageContext();
return img;
}
herry.master
la source