Question Erreur UIImagePickerController: L'instantané d'une vue qui n'a pas été rendue résulte en un instantané vide dans iOS 7


Je reçois cette erreur uniquement dans iOS 7 et l'application est tombée en panne. Dans iOS 6, je ne reçois aucune erreur, juste une fois d'avertissement de mémoire lors de l'ouverture de 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.

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 écrasée.

Cette erreur est uniquement présente dans iOS 7.

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


102
2017-09-19 08:42


origine


Réponses:


Le problème dans iOS7 concerne les transitions. Il semble que si une transition précédente n'était pas terminée et que vous en lanciez une nouvelle, iOS7 gâche les vues, où iOS6 semble le gérer correctement.

Vous devriez initialiser votre appareil photo 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
2017-10-14 10:04



Cette erreur s’est également manifestée pour moi avec le projet de code d’échantillon d’Apple PhotoPicker.

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

Étapes à suivre pour reproduire:

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

  2. Dans la ligne de commentaire APLViewController.m 125

    //imagePickerController.showsCameraControls = NO;

  3. Dans les commentaires APLViewController.m 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 le périphérique en mode paysage.

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

  7. Affichez la sortie de la console.

Sortie de la console

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

Propriété showCameraControls

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

Si vous choisissez NO, le message a été éliminé.

Rapport d'erreur

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

J'ai essayé plusieurs des suggestions faites dans différents articles, mais je n'ai pas trouvé de solution satisfaisante.


18
2017-11-02 15:05



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 changé la présentation de la vue de la caméra en mode plein écran comme décrit dans Prise de photos et de films, Bibliothèque de développeurs iOS tout s'est bien passé à nouveau et le message n'est jamais réapparu. Cependant, je devais m'assurer que selon le mode utilisé par l'application (c'est-à-dire la présentation de la caméra ou du rouleau de photos), je devais soit supprimer le popover ou le contrôleur de visualisation chaque fois que la méthode - (void) imagePickerControllerDidCancel: (UIImagePickerController *) picker a été appelé.


11
2017-10-23 17:53



créer une propriété

@property (nonatomic) UIImagePickerController *imagePickerController;

alors

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
2017-12-12 01:41



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
2018-01-26 11:50



J'ai le même problème et j'ai trouvé une solution. Je pense que cette erreur était liée à l'orientation de votre application. Mon application utilise uniquement le mode paysage, mais UIImagePickerController utilise le mode portrait. J'ajoute le 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érifier l'orientation de l'appareil dans le fichier Cible-> Général ou .plist: Orientations de l'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 mes contrôleurs de vue peuvent être pivotés en mode portrait. Donc, pour résoudre ce problème:

3) Créez une catégorie pour UINavigationController, (supportedInterfaceOrientations déplacé de 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
2017-09-25 09:21



Je reçois cette erreur lors de la création de l'application avec iOS SDK 6.1, la cible de déploiement iOS 6.1 et l'application en cours d'exécution sur l'iPhone propulsé par iOS 7. App ne plante pas mais implémente UIViewController shouldAutorotate méthode m'aide à supprimer le message d'erreur.

- (BOOL)shouldAutorotate {
    return YES;
}

3
2017-10-14 07:35



J'ai eu 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, il ne peut éditer que la photo sélectionnée à partir du rouleau de la caméra. Pour essayer de modifier la photo en capturant à partir de la caméra, 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 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, 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
2018-02-03 04:49



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 faire imagePicker comme variable globale.


1
2017-09-26 06:30



C'est ce qui m'a été corrigé sur mon application, ymmv

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

dans appname-Info.plist. dans les orientations d'interface prises en charge (iPad) ont montré 4 orientations.

dans les orientations d'interface prises en charge 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
2017-10-15 05:15