web-dev-qa-db-fra.com

Erreur UIImagePickerController: La capture instantanée d'une vue qui n'a pas été rendue entraîne la création d'une capture instantanée vide dans iOS 7

Je reçois cette erreur uniquement dans iOS 7 et l'application s'est effondrée. Sous iOS 6, je n’obtiens jamais d’erreur, une seule alerte de mémoire lors de l’ouverture de l’appareil photo.

Snapshotting a view that has not been rendered results in an empty snapshot. Ensure your view has been rendered at least once before snapshotting or snapshot after screen updates.

Voici ce que je fais.

imagePicker = [[UIImagePickerController alloc] init];
[imagePicker setDelegate:self];
[imagePicker setSourceType:UIImagePickerControllerSourceTypeCamera];
[imagePicker setAllowsEditing:YES];

[self presentModalViewController:imagePicker animated:YES];

J'ai essayé de retarder le presentModalViewController, mais je reçois toujours le même message. Après quelques secondes (7 à 10), l'application s'est bloquée.

Cette erreur est uniquement présente dans iOS 7. 

Quelqu'un a la moindre idée? Merci d'avance.

102
Didats Triadi

Le problème dans iOS7 a à voir avec les transitions. Il semble que si une transition précédente n’est pas terminée et que vous en lancez une nouvelle, iOS7 perturbe les vues, où iOS6 semble la gérer correctement.

Vous devez initialiser votre caméra dans votre UIViewController, uniquement après le chargement de la vue et avec un délai d'expiration:

- (void)viewDidAppear:(BOOL)animated 
{
    [super viewDidAppear:animated];
    //show camera...
    if (!hasLoadedCamera)
        [self performSelector:@selector(showcamera) withObject:nil afterDelay:0.3];
}

et voici le code d'initialisation

- (void)showcamera {
    imagePicker = [[UIImagePickerController alloc] init];
    [imagePicker setDelegate:self];
    [imagePicker setSourceType:UIImagePickerControllerSourceTypeCamera];
    [imagePicker setAllowsEditing:YES];

    [self presentModalViewController:imagePicker animated:YES];
}
32
Lefteris

Cette erreur s’est également produite pour moi avec le projet de code exemple PhotoPicker d’Apple.

J'utilisais Xcode Version 5.0 et iOS 7.0.3 sur un iPhone 4.

Etapes pour reproduire:

  1. Téléchargez l'exemple de projet PhotoPicker d'Apple à l'adresse https://developer.Apple.com/library/ios/samplecode/PhotoPicker/Introduction/Intro.html

  2. Dans APLViewController.m, commentez la ligne 125

    //imagePickerController.showsCameraControls = NO;

  3. Dans APLViewController.m, commentez les lignes 130-133.

    //[[NSBundle mainBundle] loadNibNamed:@"OverlayView" owner:self options:nil];
    // self.overlayView.frame = imagePickerController.cameraOverlayView.frame;
    // imagePickerController.cameraOverlayView = self.overlayView;
    // self.overlayView = nil;

  4. Construisez et lancez l'application.

  5. Une fois lancé, faites pivoter l'appareil en mode Paysage.

  6. Cliquez sur l'icône Caméra pour ouvrir UIImagePickerController en mode Caméra.

  7. Voir la sortie de la console.

Sortie de la console

PhotoPicker [240: 60b] L'instantané d'une vue qui n'a pas été rendue donne un instantané vide. Assurez-vous que votre vue a été rendue au moins une fois avant la prise de vue ou après la mise à jour de l'écran.

showsCameraControls, propriété

Le problème se produit pour moi lorsque sa valeur est OUI (valeur par défaut).

Régler ceci sur NO a éliminé le message.

Rapport d'erreur

Je viens de déposer un rapport de bogue avec Apple.

J'ai essayé beaucoup de suggestions qui ont été faites dans différents messages, mais je n'ai pas trouvé de solution de contournement satisfaisante.

18
Scott Carter

J'ai eu le problème quand j'ai essayé de présenter la vue de la caméra à l'intérieur d'un popover. Sous iOS6, ce n'était pas un problème, mais dans iOS7, j'ai reçu le message.

Snapshotting a view that has not been rendered results in an empty snapshot. Ensure your view has been rendered at least once before snapshotting or snapshot after screen updates.

ainsi que. 

Cependant, après avoir modifié la présentation de la vue de la caméra en mode plein écran, comme décrit dans Prise de photos et de séquences vidéo, bibliothèque de développement iOS tout s'est bien passé et le message n'a plus jamais été affiché. Cependant, je devais m'assurer que selon le mode d'application (c'est-à-dire présenter une vue de la caméra ou un rouleau de photos), je devais ignorer le popover ou le contrôleur de vue lorsque la méthode - (void) imagePickerControllerDidCancel: (UIImagePickerController *) picker était appelée.

11
Arne

créer une propriété 

@property (nonatomic) UIImagePickerController *imagePickerController;

Ensuite 

UIImagePickerController *picker = [[UIImagePickerController alloc] init];
picker.delegate = self;
picker.modalPresentationStyle = UIModalPresentationCurrentContext;
picker.sourceType = UIImagePickerControllerSourceTypeCamera;
picker.allowsEditing = YES;
self.imagePickerController = picker;
[self presentViewController:self.imagePickerController animated:YES completion:nil];

Cela devrait résoudre le problème

6
Asfanur

J'ai utilisé ce code pour contourner le problème:

UIImagePickerController *imagePicker = [[UIImagePickerController alloc] init];
[imagePicker setSourceType:UIImagePickerControllerSourceTypeCamera];
[imagePicker setDelegate:self];

if ([self respondsToSelector:@selector(presentViewController:animated:completion:)]){
    [imagePicker setShowsCameraControls:NO];
    [self presentViewController:imagePicker animated:YES completion:^{
        [imagePicker setShowsCameraControls:YES];
    }];
} else {
    [imagePicker setShowsCameraControls:YES];
    [self presentModalViewController:imagePicker animated:YES];
}
4
Germán Marquès

J'avais le même problème lorsque j'essayais de modifier l'application de démonstration fournie avec le Avirary SDK , Dans l'application de démonstration, elle ne peut que modifier la photo prise à partir de la pellicule. Pour essayer de modifier la photo en capturant à partir de l'appareil photo, j'ai d'abord ajouté le code suivant dans le fichier UIViewcontroller.m:

#pragma mark - Take Picture from Camera
- (void)showCamera
{
//[self launchPhotoEditorWithImage:sampleImage highResolutionImage:nil];

    if ([self hasValidAPIKey]) {
        UIImagePickerController * imagePicker = [UIImagePickerController new];
        [imagePicker setSourceType:UIImagePickerControllerSourceTypeCamera];
        [imagePicker setDelegate:self];
        [imagePicker setAllowsEditing:YES]; //important, must have

        if (UI_USER_INTERFACE_IDIOM() == UIUserInterfaceIdiomPhone) {
            [self presentViewController:imagePicker animated:YES completion:nil];
        }else{
            [self presentViewControllerInPopover:imagePicker];
        }
    }
}

Ensuite, lorsque je lance l'application, l'erreur est survenue:

Snapshotting a view that has not been rendered results in an empty snapshot. Ensure your view has been rendered at least once before snapshotting or snapshot after screen updates.

Pour résoudre cette erreur, modifiez le délégué UIImagePicker dans votre fichier UIViewContooler.m comme indiqué ci-dessous:

#pragma mark - UIImagePicker Delegate

- (void) imagePickerController:(UIImagePickerController *)picker didFinishPickingMediaWithInfo:(NSDictionary *)info
{
    NSURL * assetURL = [info objectForKey:UIImagePickerControllerReferenceURL];

    void(^completion)(void)  = ^(void){

        [[self assetLibrary] assetForURL:assetURL resultBlock:^(ALAsset *asset) {
            if (asset){
                [self launchEditorWithAsset:asset];
            }
        } failureBlock:^(NSError *error) {
            [[[UIAlertView alloc] initWithTitle:@"Error" message:@"Please enable access to your device's photos." delegate:nil cancelButtonTitle:@"OK" otherButtonTitles:nil] show];
        }];

        UIImage * editedImage = [info objectForKey:UIImagePickerControllerEditedImage];
        if(editedImage){
            [self launchPhotoEditorWithImage:editedImage highResolutionImage:editedImage];
        }

    };

    if (UI_USER_INTERFACE_IDIOM() == UIUserInterfaceIdiomPhone) {
        [self dismissViewControllerAnimated:YES completion:completion];
    }else{
        [self dismissPopoverWithCompletion:completion];
    }

}    

Puis l'erreur a disparu et l'application fonctionne!

3
Tony

Je reçois cette erreur lors de la création d'une application avec iOS SDK 6.1, du déploiement cible d'iOS 6.1 et de l'exécution de l'application sur un iPhone iOS 7 L'application ne plante pas, mais la méthode UIViewController shouldAutorotate m'aide à supprimer le message d'erreur.

- (BOOL)shouldAutorotate {
    return YES;
}
3
Grigori A.

J'ai le même problème et j'ai trouvé une solution. Je pense que cette erreur est liée à l'orientation de votre application. Mon application utilise uniquement le mode paysage, mais UIImagePickerController utilise le mode portrait. J'ajoute un bloc try-catch à main.m et j'obtiens une véritable exception: 

Supported orientations has no common orientation with the application, and shouldAutorotate is returning YES

Comment je résous ce problème:

1) Revérifiez l'orientation du périphérique dans Target-> General ou dans le fichier .plist: Orientations d'interface prises en charge: Paysage gauche, Paysage droite.

2) Ajouter dans AppDelegate.m:

- (NSUInteger)application:(UIApplication *)application supportedInterfaceOrientationsForWindow:(UIWindow *)window {
    return UIInterfaceOrientationMaskLandscape | UIInterfaceOrientationMaskPortrait;
}

Après cette étape, UIImagePickerController fonctionne correctement, mais vous pouvez faire pivoter mes contrôleurs de vue en mode portrait. Donc, pour résoudre ceci:

3) Créez une catégorie pour UINavigationController (prise en charge d'InterfaceOrientations déplacée d'UIViewController vers UINavigationController dans iOS6):

@implementation UINavigationController (RotationIOS6)

- (NSUInteger)supportedInterfaceOrientations {
    return UIInterfaceOrientationMaskLandscape;
}

@end

Cette solution fonctionne correctement sur iOS 6.0, 6.1, 7.0. J'espère que cela t'aides.

3
Roman Ermolov

Essayez ceci, utilisez 

[self performSelector:@selector(presentCameraView) withObject:nil afterDelay:1.0f];

et fonction

-(void)presentCameraView{
    [self presentViewController:imagePicker animated:YES completion:nil];
}

remplacer. [self presentModalViewController:imagePicker animated:YES]; et de cause make imagePicker en tant que variable globale.

1
JerryZhou

C'est ce qui l'a corrigé pour moi sur mon application, ymmv

tout d'abord, c'est une application iPhone - iPad

dans appname-Info.plist. dans les orientations prises en charge de l'interface (iPad) a montré 4 orientations.

dans les interfaces prises en charge, les orientations ont montré 3 orientations. J'ai ajouté le quatrième et exécuté l'application, pas de sortie de débogage. 

J'espère que cela t'aides.

1
user1045302

J'ai passé beaucoup de temps à essayer de trouver la solution, et étonnamment, je l'ai trouvée à la fin et c'était très amusant une fois que je l'ai découverte.

Voici ce que vous allez faire pour récupérer l’image que vous avez choisie et reprendre votre travail :)

-(void)imagePickerController:(UIImagePickerController*)picker didFinishPickingMediaWithInfo:(NSDictionary*)info
{
    UIImage* pickedImage = [info objectForKey:@"UIImagePickerControllerOriginalImage"];
    [composeImageView setImage:pickedImage];
[picker dismissViewControllerAnimated:YES completion:nil];
 }

Oui, pour résoudre le problème, il vous suffit de fermer le sélecteur normalement car il semble que le message suivant: "Capture instantanée d’une vue qui n’a pas été rendue donne un instantané vide. mises à jour de l'écran. " empêche le sélecteur d'être réactif, mais vous pouvez le rejeter et récupérer l'image normalement. 

0
DevSherif

Je viens de rencontrer le même problème. Dans mon cas, le problème était que j'avais du code non-ARC et que je l'avais migré vers ARC. Lorsque j'ai effectué la migration, je ne faisais pas une référence forte à UIImagePickerController et c’était la raison de cet accident.

J'espère que ça aide :)

0
arturgrigor

Dans mon cas, cela était lié à un changement de mise en page: le VC présentant la UIImagePickerViewController a la barre d'état masquée, mais pas la UIImagePickerViewController.

Alors, j'ai résolu le problème en cachant la barre d'état dans la variable UIImagePickerViewController, comme indiqué dans cette réponse .

0
kanobius

J'ai eu le même problème dans iOS 8, mais l'accès à la caméra était Désactiver dans Paramètres -> Confidentialité pour mon application. Just Enabled, et ça fonctionnait.

0
BhushanVU