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.
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];
}
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:
-
télécharger le projet D'échantillon Photopicker D'Apple à https://developer.apple.com/library/ios/samplecode/PhotoPicker/Introduction/Intro.html
-
In APLViewController.m commentaire sur la ligne 125
//imagePickerController.showsCameraControls = NO;
-
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;
-
Construisez et lancez l'application.
-
une fois lancé, tournez le dispositif en mode paysage.
-
cliquez sur l'icône de la caméra pour ouvrir UIImagePickerController en mode caméra.
-
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.
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é.
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
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];
}
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.
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;
}
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!
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.
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.
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 :)
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.
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.
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 .
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.
Changer
[self presentViewController:imagePicker animated:YES completion:nil];
à
[self presentViewController:imagePicker animated:YES completion:NULL];
a réglé le problème pour moi.