web-dev-qa-db-fra.com

Pourquoi ma capture d'écran créée par programme est-elle si mauvaise sur iOS 7?

J'essaie de mettre en œuvre l'application de partage avec Facebook. J'ai utilisé ce code pour faire la capture d'écran:

CGSize imageSize = CGSizeMake(self.view.bounds.size.width, self.view.bounds.size.height);
UIGraphicsBeginImageContext(imageSize);
[self.view.layer renderInContext:UIGraphicsGetCurrentContext()];
UIImage *viewImage = UIGraphicsGetImageFromCurrentImageContext();
UIGraphicsEndImageContext();

Cela fonctionne très bien sur iOS 6, mais dans iOS 7, l'image semble très mauvaise. J'ai utilisé cette réponse: iOS: quel est le moyen le plus rapide et le plus performant de faire une capture d'écran par programme? pour essayer de le réparer, et cela a aidé, la capture d'écran semble toujours mauvaise. L'écran prend une autre couleur et certains objets (comme les étiquettes) n'apparaissent pas sur l'image prise. De l'aide?

----Mise à jour----

J'ai réussi à résoudre le plus d'objets, en les modifiant pour les conserver au lieu de les affaiblir. Mon principal problème est resté ma vue de table, celle montrée comme un gros bloc blanc (Il était censé être transparent, avec des étiquettes avec du texte blanc, donc tout ce que nous voyons est des globules blancs). J'ai essayé de définir l'arrière-plan du tableau comme clearcolor, ça n'aide pas ..

----Dernière mise à jour---

Il y a ici de merveilleuses réponses qui ne concernent pas vraiment mon problème. Je voulais le faire fonctionner sur un appareil fonctionnant avec iOS7 mais sans utiliser le SDK iOS7, car il faut beaucoup d'efforts pour changer le SDK du projet à ce stade, lorsque le projet est presque terminé.

Quoi qu'il en soit, j'ai ajouté la paix du code qui a finalement résolu mon problème:

Ce changement résout simplement le problème:

UIGraphicsBeginImageContextWithOptions(imageSize, NO , 0.0f);

au lieu de:

UIGraphicsBeginImageContext(imageSize);
29
Yossi

Nouveau API a été ajouté depuis iOS 7, ce qui devrait fournir un moyen efficace d'obtenir un instantané

  • snapshotViewAfterScreenUpdates: rend la vue dans une UIView avec _modifiable content

  • resizableSnapshotViewFromRect:afterScreenUpdates:withCapInsets: même chose, mais avec des encarts redimensionnables

  • drawViewHierarchyInRect:afterScreenUpdates:: même chose si vous avez besoin que toutes les sous-vues soient dessinées aussi (comme les étiquettes, les boutons ...)

Vous pouvez utiliser le UIView renvoyé pour tout effet d'interface utilisateur, ou effectuer le rendu dans une image comme vous l'avez fait si vous devez exporter.

Je ne sais pas à quel point cette nouvelle méthode fonctionne bien par rapport à celle que vous avez fournie (bien que je me souvienne Apple ont déclaré que cette nouvelle API était plus efficace)

55
Vinzzz

tu peux essayer ça

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

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

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

dans iOS 8: voici comment je fais pour obtenir ScreenShot

  1. vient d'ajouter un UIImageView et une méthode pour prendre une capture d'écran dans fichier. h

@property (faible, non anatomique) IBOutlet UIImageView * imageView;

 -(IBAction)takeSnapShot:(id)sender;

2 coupures de code ajoutées pour prendre une capture d'écran et définir sur UIImageView dans le fichier .m

- (IBAction)takeSnapShot:(id)sender
{
    UIGraphicsBeginImageContext(self.view.bounds.size);
    [self.view.layer renderInContext:UIGraphicsGetCurrentContext()];
    UIImage *snapShotImage = UIGraphicsGetImageFromCurrentImageContext();
    UIGraphicsEndImageContext();

    imageView.image = snapShotImage;
}
  1. ci-dessous est la sortie que j'ai obtenue.

enter image description here

6
swiftBoy

Sur iOS7, vous pouvez avoir des problèmes si vous utilisez

[view drawViewHierarchyInRect:view.bounds afterScreenUpdates:YES]

pendant l'animation en cours. Ensemble afterScreenUpdates = NO pour se débarrasser des pépins.

5
ancajic

Assurez-vous que opaque est défini sur NO

0