Erreur UIImagePickerController: Snapshot une vue qui n'a pas été rendue donne un instantané vide dans iOS 7

j'obtiens cette erreur seulement dans iOS 7 et l'application s'est écrasée. Dans iOS 6, Je n'obtiens jamais d'erreur, juste une fois d'avertissement de mémoire quand j'ouvre la caméra.

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.

voilà 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 l'presentModalViewController, mais je reçois toujours le même message. Après quelques secondes (7-10), l'application s'est écrasé.

cette erreur n'est présente que dans iOS 7.

Quelqu'un a l'indice? Je vous remercie à l'avance.

102
demandé sur Marco 2013-09-19 12:42:44

16 réponses

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 gâche les vues, où iOS6 semble la gérer correctement.

vous devez initialiser votre caméra dans votre UIViewController , seulement après que la vue a chargé et avec un timeout:

- (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
répondu Lefteris 2013-10-14 10:04:10

cette erreur s'est également manifestée pour moi avec le projet de code d'échantillon de PhotoPicker D'Apple.

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

étapes pour reproduire:

  1. télécharger le projet D'échantillon Photopicker D'Apple à https://developer.apple.com/library/ios/samplecode/PhotoPicker/Introduction/Intro.html

  2. In APLViewController.m commentaire sur la ligne 125

    //imagePickerController.showsCameraControls = NO;

  3. In APLViewController.m commentaire 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é, tournez le dispositif en mode paysage.

  6. cliquez sur l'icône de la caméra pour ouvrir UIImagePickerController en mode caméra.

  7. afficher la sortie de la console.

sortie de la Console

PhotoPicker[240: 60b] Snapshot 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 snapshot ou snapshot après les mises à jour à l'écran.

showsCameraControls propriété

le problème se produit pour moi quand cela a une valeur de oui (la valeur par défaut).

le réglage de cette valeur à NO a éliminé le message.

rapport de bogue

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

j'ai essayé de nombreuses suggestions qui ont été faites dans différents postes, mais n'ont pas trouvé une solution satisfaisante.

18
répondu Scott Carter 2015-01-30 10:52:03

j'ai eu le problème quand j'ai essayé de présenter la vue de la caméra à l'intérieur d'une liste. 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.

aussi.

cependant après que j'ai changé la présentation de la vue de l'appareil photo en plein écran comme décrit dans prendre des photos et des films, iOS développeur Bibliothèque tout est allé bien à nouveau et le message n'est jamais apparu à nouveau. Cependant je devais m'assurer que selon le mode dans lequel l'application est (i.e., présentation d'une vue de caméra ou de photo roll) j'ai dû soit rejeter le popover ou le contrôleur de vue chaque fois que la méthode - (void) imagePickerControllerDidCancel: (UIImagePickerController *) picker a été appelé.

11
répondu Arne 2013-10-23 17:53:31

créer une propriété

@property (nonatomic) UIImagePickerController *imagePickerController;

puis

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
répondu Asfanur 2013-12-12 03:42:53

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
répondu Germán Marquès 2014-01-26 11:50:11

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 demande. Mon application utilise uniquement le mode paysage, mais UIImagePickerController utilise le mode portrait. J'ajoute le bloc "try-catch" au bloc "main".m, et obtenir une réelle exception:

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

comment je résous ce problème:

1) revérifier L'orientation du dispositif dans Target->General, or .fichier plist: orientations de l'interface supportée: 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 mes viewcontrollers peuvent être tournés en mode portrait. Donc, pour résoudre ceci:

3) Créer une catégorie pour les UINavigationController, (supportedInterfaceOrientations déplacé de UIViewController à UINavigationController dans iOS6):

@implementation UINavigationController (RotationIOS6)

- (NSUInteger)supportedInterfaceOrientations {
    return UIInterfaceOrientationMaskLandscape;
}

@end

Cette solution fonctionne correctement sur iOS 6.0, 6.1, 7.0. Espérer cela aide.

3
répondu Roman Ermolov 2013-09-25 09:21:49

je reçois cette erreur lors de la construction de l'application avec IOS SDK 6.1, déploiement cible iOS 6.1 et l'exécution de l'application sur iPhone iOS 7 powered. App ne plante pas, mais l'implémentation de la méthode UIViewController shouldAutorotate m'aide à supprimer le message d'erreur.

- (BOOL)shouldAutorotate {
    return YES;
}
3
répondu Grigori A. 2013-10-14 07:35:48

j'ai eu le même problème quand j'ai essayé de modifier l'application de démonstration qui viennent avec le Avirary SDK , dans l'application de démonstration, il ne peut éditer la photo choisie à partir du rouleau de l'appareil photo. Pour essayer de modifier la photo en capturant à partir de la caméra, j'ai d'abord ajouté le code suivant dans le Controller UIViewcontroller.m fichier:

#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];
        }
    }
}

puis quand j'exécute l'application, l'erreur s'est produite:

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 l'erreur, modifié le Uiimagepicker délégué dans votre UIViewContooler.m fichier 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
répondu Tony 2014-02-03 04:49:02

essayez ceci, utilisez

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

et fonction

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

pour remplacer. [self presentModalViewController:imagePicker animated:YES]; et de cause font imagePicker comme une variable globale.

1
répondu JerryZhou 2013-09-26 06:30:27

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

tout d'abord, il est un iPhone-application iPad

dans nom-Info.plist. dans l'interface supportée orientations (iPad) A Montré 4 orientations.

dans les orientations de l'interface supportée montre 3 orientations. J'ai ajouté le quatrième et lancé l'application, Pas de sortie de débogage.

Espérons que cette aide.

1
répondu user1045302 2013-10-15 05:15:54

je viens de rencontrer le même problème. Dans mon cas, le problème était que j'avais un code non-ARC et je l'ai migré vers ARC. Quand j'ai fait la migration, je n'avais pas de référence forte au UIImagePickerController et c'était la raison de l'accident.

Espère que cela aide :)

0
répondu arturgrigor 2014-11-26 11:32:17

j'ai eu le même problème dans iOS 8, Mais la Caméra d'Accès a été Désactiver l'intérieur Paramètres " --> "Confidentialité pour mon Application. Juste Permis, et C'était le travail.

0
répondu BhushanVU 2015-04-10 12:34:40

j'ai passé de long moment d'essayer de trouver la solution, et étonnamment, j'ai trouvé à la fin et c'était très drôle une fois que je l'ai découvert.

voici ce que vous allez faire pour récupérer l'image que vous avez choisi et reprendre le 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, vous avez seulement besoin de rejeter le picker normalement comme il semble ce message: "Snapshot une vue qui n'a pas été rendue se traduit par un instantané vide. Assurer votre point de vue a rendu au moins une fois avant snapshot ou snapshot après les mises à jour à l'écran."empêche le picker d'être réactif, mais vous pouvez le rejeter et récupérer l'image normalement.

0
répondu DevSherif 2015-05-06 09:56:19

dans mon cas, il a été lié avec un changement de layout: le VC présentant le UIImagePickerViewController a la barre d'état cachée, mais le UIImagePickerViewController n'a pas.

donc, je l'ai résolu cachant la barre d'état dans le UIImagePickerViewController comme il est montré dans ce réponse .

0
répondu kanobius 2016-04-14 15:49:21

ne répondant pas directement à votre question mais vous avez mentionné que vous aviez un avertissement mémoire ,vous pourriez stocker l'image brute dans une propriété qui peut conduire à un avertissement mémoire. C'est parce que l'image brute prend environ 30MB de mémoire. J'ai remarqué un avertissement de mémoire similaire lors du test des applications sur iOS6 qui étaient sur la série iPhone 4. J'ai toujours eu cet avertissement quand les appareils ont été mis à niveau pour iOS7. Il n'y a pas d'avertissement de mémoire lors des tests sur iPhone 5 series sur iOS7.

-1
répondu DevC 2013-12-10 09:56:12

Changer

[self presentViewController:imagePicker animated:YES completion:nil];

à

[self presentViewController:imagePicker animated:YES completion:NULL];

a réglé le problème pour moi.

-5
répondu Yuki 2014-04-02 20:08:19