plus - Error de UIImagePickerController: la captura de una vista que no se ha procesado genera una instantánea vacía en iOS 7
no funciona captura de pantalla iphone (16)
Recibo este error solo en iOS 7 y la aplicación se bloqueó. En iOS 6, nunca aparece ningún error, solo una vez de advertencia de memoria al abrir la cámara.
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.
Esto es lo que estoy haciendo.
imagePicker = [[UIImagePickerController alloc] init];
[imagePicker setDelegate:self];
[imagePicker setSourceType:UIImagePickerControllerSourceTypeCamera];
[imagePicker setAllowsEditing:YES];
[self presentModalViewController:imagePicker animated:YES];
Intenté retrasar el presentModalViewController, pero sigo recibiendo el mismo mensaje. Después de unos segundos (7-10), la aplicación se bloqueó.
Este error solo está presente en iOS 7.
¿Alguien tiene la pista? Gracias de antemano.
Acabo de encontrar el mismo problema. En mi caso, el problema era que tenía un código que no era ARC y lo he migrado a ARC. Cuando hice la migración, no hice una referencia fuerte al UIImagePickerController
y esa fue la razón del bloqueo.
Espero eso ayude :)
Aunque no respondiste directamente a tu pregunta, pero mencionaste que tenías una advertencia de memoria, es posible que estés almacenando la imagen sin formato en una propiedad que puede provocar una advertencia de memoria. Esto se debe a que la imagen sin formato ocupa aproximadamente 30 MB de memoria. Noté una advertencia de memoria similar cuando probaba aplicaciones en iOS6 que estaban en la serie iPhone 4. Todavía recibí esta advertencia cuando los dispositivos se actualizaron a iOS7. No hay advertencia de memoria cuando se prueba en la serie iPhone 5 en iOS7.
Cambiando
[self presentViewController:imagePicker animated:YES completion:nil];
a
[self presentViewController:imagePicker animated:YES completion:NULL];
arregló el problema para mí
El problema en iOS7 tiene que ver con las transiciones. Parece que si una transición previa no se completó y se lanza una nueva, iOS7 daña las vistas, donde iOS6 parece administrarlo correctamente.
Debe inicializar su cámara en su UIViewController
, solo después de que la vista tenga Cargado y con un tiempo de espera UIViewController
:
- (void)viewDidAppear:(BOOL)animated
{
[super viewDidAppear:animated];
//show camera...
if (!hasLoadedCamera)
[self performSelector:@selector(showcamera) withObject:nil afterDelay:0.3];
}
y aquí está el código de inicialización
- (void)showcamera {
imagePicker = [[UIImagePickerController alloc] init];
[imagePicker setDelegate:self];
[imagePicker setSourceType:UIImagePickerControllerSourceTypeCamera];
[imagePicker setAllowsEditing:YES];
[self presentModalViewController:imagePicker animated:YES];
}
En mi caso, se relacionó con un cambio de diseño: el VC que presenta el UIImagePickerViewController
tiene la barra de estado oculta, pero el UIImagePickerViewController
no.
Entonces, lo resolví ocultando la barra de estado en el UIImagePickerViewController
como se muestra en esta respuesta .
Este error también apareció para mí con el proyecto de código de muestra PhotoPicker de Apple.
Estaba usando Xcode Version 5.0 y iOS 7.0.3 en un iPhone 4.
Pasos para reproducir:
Descargue el proyecto de ejemplo PhotoPicker de Apple en https://developer.apple.com/library/ios/samplecode/PhotoPicker/Introduction/Intro.html
En APLViewController.m comenta la línea 125
//imagePickerController.showsCameraControls = NO;
En APLViewController.m comenta las líneas 130-133
//[[NSBundle mainBundle] loadNibNamed:@"OverlayView" owner:self options:nil];
// self.overlayView.frame = imagePickerController.cameraOverlayView.frame;
// imagePickerController.cameraOverlayView = self.overlayView;
// self.overlayView = nil;
Cree y ejecute la aplicación.
Una vez lanzado, gire el dispositivo al modo Paisaje.
Haga clic en el icono de la cámara para abrir UIImagePickerController en el modo de cámara.
Ver la salida de la consola.
Salida de consola
PhotoPicker [240: 60b] Hacer una instantánea de una vista que no se ha renderizado da como resultado una instantánea vacía. Asegúrese de que su vista se haya renderizado al menos una vez antes de realizar una instantánea o una instantánea después de las actualizaciones de la pantalla.
Muestra la propiedadCameraControls
El problema se me ocurre cuando tiene un valor de SÍ (valor predeterminado).
Establecer esto en NO eliminó el mensaje.
Informe de error
Acabo de presentar un informe de error con Apple.
He intentado muchas de las sugerencias que se han hecho en diferentes publicaciones, pero no he encontrado una solución satisfactoria.
Esto es lo que me solucionó en mi aplicación, mmm
En primer lugar, es una aplicación iPhone - iPad
en appname-Info.plist. en las orientaciones de interfaz admitidas (iPad) mostraron 4 orientaciones.
en las orientaciones de la interfaz soportada mostró 3 orientaciones. Agregué el cuarto y ejecuté la aplicación, sin salida de depuración.
Espero que esto ayude.
Pasé mucho tiempo tratando de encontrar la solución, y sorprendentemente la encontré al final y fue muy divertida una vez que la descubrí.
Esto es lo que harás para recuperar la imagen que elegiste y continuar trabajando :)
-(void)imagePickerController:(UIImagePickerController*)picker didFinishPickingMediaWithInfo:(NSDictionary*)info
{
UIImage* pickedImage = [info objectForKey:@"UIImagePickerControllerOriginalImage"];
[composeImageView setImage:pickedImage];
[picker dismissViewControllerAnimated:YES completion:nil];
}
Sí, para solucionar el problema, solo tiene que descartar el selector normalmente, ya que parece que este mensaje: "Hacer una instantánea de una vista que no se haya procesado genera una instantánea vacía. Asegúrese de que su vista se haya renderizado al menos una vez antes de realizar una instantánea o una instantánea actualizaciones de pantalla ". evita que el selector responda, pero puede descartarlo y recuperar la imagen normalmente.
Prueba esto, usa
[self performSelector:@selector(presentCameraView) withObject:nil afterDelay:1.0f];
y función
-(void)presentCameraView{
[self presentViewController:imagePicker animated:YES completion:nil];
}
para reemplazar. [self presentModalViewController:imagePicker animated:YES];
y de causa hacer imagePicker
como una variable global.
Recibo este error al crear una aplicación con iOS SDK 6.1, destino de implementación iOS 6.1 y aplicación en ejecución en iOS 7 con iPhone. La aplicación no falla, pero la implementación del método UIViewController shouldAutorotate
me ayuda a eliminar el mensaje de error.
- (BOOL)shouldAutorotate {
return YES;
}
Tengo el mismo problema y encontré una solución. Creo que ese error está relacionado con la orientación de tu aplicación. Mi aplicación utiliza solo el modo horizontal, pero UIImagePickerController usa el modo vertical. Agrego el bloque try-catch a main.m, y obtengo una excepción real:
Supported orientations has no common orientation with the application, and shouldAutorotate is returning YES
Cómo resuelvo este problema:
1) Vuelva a verificar la orientación del dispositivo en Target-> General o en el archivo .plist: Orientaciones de interfaz compatibles: Landscape left, Landscape right.
2) Agregar en AppDelegate.m:
- (NSUInteger)application:(UIApplication *)application supportedInterfaceOrientationsForWindow:(UIWindow *)window {
return UIInterfaceOrientationMaskLandscape | UIInterfaceOrientationMaskPortrait;
}
Después de este paso, UIImagePickerController funciona correctamente, pero mis viewcontrollers se pueden rotar al modo vertical. Entonces, para resolver esto:
3) Cree una categoría para UINavigationController, (supportedInterfaceOrientations trasladado de UIViewController a UINavigationController en iOS6):
@implementation UINavigationController (RotationIOS6)
- (NSUInteger)supportedInterfaceOrientations {
return UIInterfaceOrientationMaskLandscape;
}
@end
Esta solución funciona correctamente en iOS 6.0, 6.1, 7.0. Espero que esto ayude.
Tuve el mismo problema cuando estaba tratando de modificar la aplicación de demostración que viene con Avirary SDK , en la aplicación de demostración, solo puede editar la foto tomada desde el carrete de la cámara. Para tratar de editar la foto capturando desde la cámara, primero agregué el siguiente código en el archivo 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];
}
}
}
Luego, cuando ejecuté la aplicación, ocurrió el error:
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.
Para resolver el error, modificó el delegado UIImagePicker en su archivo UIViewContooler.m como se muestra a continuación:
#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];
}
}
¡Entonces el error desapareció y la aplicación funciona!
Tuve el mismo problema en iOS 8, pero el Acceso a la cámara se deshabilitó en Configuración -> Privacidad para mi aplicación. Just Enabled, y funcionó.
Tuve el problema cuando traté de presentar la vista de la cámara dentro de un popover. En iOS6 esto no fue un problema, pero en iOS7 recibí el mensaje
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.
también.
Sin embargo, después de cambiar la presentación de la vista de cámara a pantalla completa como se describe en Cómo tomar fotos y películas, iOS Developer Library todo volvió a funcionar bien y el mensaje nunca volvió a aparecer. Sin embargo, tuve que asegurarme de que dependiendo de en qué modo esté la aplicación (es decir, presentando la vista de cámara o el rollo de fotos) tuve que descartar el controlador de vista o popover siempre que el método - (void) imagePickerControllerDidCancel: (UIImagePickerController *) picker
fue llamado.
Utilicé este código para solucionar el problema:
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];
}
crear una propiedad
@property (nonatomic) UIImagePickerController *imagePickerController;
Entonces
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];
esto deberia resolver el problema