135 votes

Comment faire une capture d’écran d’une UIView ?

Je me demande comment mon application iPhone peut prendre une capture d’écran d’une UIView spécifique comme une UIImage.

J’ai essayé ce code, mais tout ce que j’obtiens est une image vide.

``a dimensions 320 x 480 une il a quelques sous-vues. Quelle est la façon correcte de le faire ?

Merci d’avance.

190voto

Klaas Points 2995

iOS 7 a une nouvelle méthode qui permet de dessiner une vue de la hiérarchie dans l'actuel contexte graphique. Ceci peut être utilisé pour obtenir une UIImage très rapide.

J'ai mis en place une catégorie de méthode sur UIView pour obtenir la vue comme une UIImage:

- (UIImage *)pb_takeSnapshot {
    UIGraphicsBeginImageContextWithOptions(self.bounds.size, NO, [UIScreen mainScreen].scale);

    [self drawViewHierarchyInRect:self.bounds afterScreenUpdates:YES];

    // old style [self.layer renderInContext:UIGraphicsGetCurrentContext()];

    UIImage *image = UIGraphicsGetImageFromCurrentImageContext();
    UIGraphicsEndImageContext();
    return image;
}

Il est beaucoup plus rapide que l'existant renderInContext: la méthode.

Référence : https://developer.apple.com/library/ios/qa/qa1817/_index.html

Mise à JOUR POUR SWIFT: Une extension qui fait la même chose:

extension UIView {

    func pb_takeSnapshot() -> UIImage {
        UIGraphicsBeginImageContextWithOptions(self.bounds.size, false, UIScreen.mainScreen().scale);

        self.drawViewHierarchyInRect(self.bounds, afterScreenUpdates: true)

        // old style: self.layer.renderInContext(UIGraphicsGetCurrentContext())

        let image = UIGraphicsGetImageFromCurrentImageContext();
        UIGraphicsEndImageContext();
        return image;
    }
}

73voto

Je pense que vous pouvez , pas . drawInContext est plus une méthode que vous serait substituer...

Notez qu’il peut ne pas fonctionner dans tous les modes, plus précisément une année ou il y a donc quand j’ai essayé de l’utiliser avec la vue caméra en direct il ne fonctionnait pas.

63voto

Tibidabo Points 10510

Vous devez saisir la clé de fenêtre pour une capture d'écran ou une UIView. Vous pouvez le faire dans la Rétine de la Résolution à l'aide de UIGraphicsBeginImageContextWithOptions et définir son paramètre d'échelle 0.0 f. Il capte toujours en résolution native (retina pour iPhone 4 et versions ultérieures).

Celui-ci fait un plein écran capture d'écran (touche de la fenêtre)

UIWindow *keyWindow = [[UIApplication sharedApplication] keyWindow];
CGRect rect = [keyWindow bounds];
UIGraphicsBeginImageContextWithOptions(rect.size,YES,0.0f);
CGContextRef context = UIGraphicsGetCurrentContext();
[keyWindow.layer renderInContext:context];   
UIImage *capturedScreen = UIGraphicsGetImageFromCurrentImageContext();
UIGraphicsEndImageContext();

Ce code capturer une UIView en résolution native

CGRect rect = [captureView bounds];
UIGraphicsBeginImageContextWithOptions(rect.size,YES,0.0f);
CGContextRef context = UIGraphicsGetCurrentContext();
[captureView.layer renderInContext:context];   
UIImage *capturedImage = UIGraphicsGetImageFromCurrentImageContext();
UIGraphicsEndImageContext();

Cela permet d'économiser le UIImage au format jpg avec 95% de la qualité dans l'application du document dossier si vous avez besoin de le faire.

NSString  *imagePath = [NSHomeDirectory() stringByAppendingPathComponent:[NSString stringWithFormat:@"Documents/capturedImage.jpg"]];    
[UIImageJPEGRepresentation(capturedImage, 0.95) writeToFile:imagePath atomically:YES];

22voto

san Points 1897

iOS7 partir, nous avons au-dessous des méthodes par défaut :

- (UIView *)snapshotViewAfterScreenUpdates:(BOOL)afterUpdates

L'appel de méthode ci-dessus est plus rapide que d'essayer de rendre le contenu de la vue courante dans une image bitmap vous-même.

Si vous souhaitez appliquer un effet graphique, tels que le flou, à un instantané, l'utilisation de l' drawViewHierarchyInRect:afterScreenUpdates: méthode à la place.

https://developer.apple.com/library/ios/documentation/uikit/reference/uiview_class/uiview/uiview.html

7voto

new soul Points 211
<pre><code></code><p>Cette méthode peut mettre dans votre classe de contrôleur.</p></pre>

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X