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)
ios
swift
uiview
screenshot
Sameer Hussain
la source
la source
Réponses:
Une extension sur
UIView
devrait faire l'affaire.Apple déconseille d'utiliser le
UIGraphicsBeginImageContext
démarrage d'iOS 10 avec l'introduction de la gamme de couleurs P3.UIGraphicsBeginImageContext
est sRGB et 32 bits uniquement. Ils ont introduit la nouvelleUIGraphicsImageRenderer
API 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
#available
avec un retour aux versions antérieures d'iOS:la source
let view = UIView(frame: CGRect(x: 0, y: 0, width: 100, height: 100)); view.backgroundColor = .black; view.layer.cornerRadius = 9; view.asImage();
vous pouvez utiliser l'extension
Voici la version Swift 3/4:
la source
let image = UIImage(view: myView)
UIGraphicsBeginImageContextWithOptions(view.frame.size, false, UIScreen.main.scale)
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
Enregistrer l'image modifiée Album photo
Swift 3/4
Généralisation super facile avec extension, iOS11, swift3 / 4
la source
Sur iOS 10:
la source
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
Je ne sais pas ce que signifie la question par:
la source
la source
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:
la source
À mon avis, l'approche avec l'initialiseur n'est pas terrible car elle crée deux images.
Je préfère ça:
la source
Swift 4.2, iOS 10
Échantillon
la source
Cela fonctionne pour moi pour Xcode 9 / Swift 3.2 / Swift 4 et Xcode 8 / Swift 3
Voici comment l'utiliser dans une fonction:
Voici comment faire quelque chose avec l'image renvoyée par la fonction:
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ù :(
la source
ou en objectif-c
la source
Vous pouvez l'utiliser facilement en utilisant l'extension comme celle-ci
Si vous souhaitez utiliser ces méthodes / variables d'extension, implémentez ceci
Extension UIImage
Extension UIView
Extension UIApplication
la source
ou iOS 10+, vous pouvez utiliser le nouveau UIGraphicsImageRenderer + le drawHierarchy recommandé, qui dans certaines situations peut être beaucoup plus rapide que layer.renderInContext
la source
Merci @Bao Tuan Diep! Je veux ajouter un supplément.
Lorsque vous utilisez le code:
Vous devez remarquer que:
Ensuite, vous devez utiliser :
mettre à jour
yourView
avantyourView.layer.render(in:UIGraphicsGetCurrentContext()!)
.Sinon, vous risquez d'obtenir un objet image qui ne contient aucun élément
la source
Swift 4.2
la source
Implémentation dans Swift 3 :
Ajoutez le code ci-dessous, hors de la portée de la classe.
Utilisation:
la source
J'ai implémenté @Naveed J. comme ça, et ça a fonctionné comme un charme.
Voici son extension:
Voici comment je l'ai implémenté.
la source
Initialiseur avec le nouveau UIGraphicsImageRenderer disponible depuis iOS 10:
la source
fonctionne bien avec moi!
Swift4
la source
return snapshotImageFromMyView!
Thread 1: Erreur fatale: trouvé nul de manière inattendue lors du déballage d'une valeur facultativePour 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.
la source
L'utilisation de UIGraphicsImageRenderer ne fonctionne pas lorsque la vue contient des sous-vues Scene Kit, Metal ou Sprite Kit. Dans ces cas, utilisez
la source
la source