Error de UIImagePickerController: la instantánea de una vista que no se ha representado da como resultado una instantánea vacía en iOS 7

103

Recibo este error solo en iOS 7 y la aplicación se bloqueó. En iOS 6, nunca recibo 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?

Didats Triadi
fuente
3
Tengo el mismo problema. En iOS7, UIIMagePickerController ya no funciona.
condor304
Llamar a este método funcionó para mí. Colóquelo después de presentar su vista. [yourViewBeingPresented.view layoutIfNeeded];
Bobby

Respuestas:

32

El problema en iOS7 tiene que ver con las transiciones. Parece que si una transición anterior no se completó y lanzas una nueva, iOS7 estropea las vistas, donde iOS6 parece administrarlo correctamente.

Debe inicializar su cámara en su UIViewController, solo después de que la vista se haya cargado y con un tiempo de espera:

- (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];
}
Lefteris
fuente
1
Esto parece funcionar hasta ahora, lo he probado tomando 10 fotos una tras otra sin ningún problema.
DevC
3
presentModalViewController quedó obsoleto en iOS 6. Se sugiere que presentViewController se utilice ahora.
Gallymon
5
El mismo problema y solución para iOS8.
Yauheni Shauchenka
1
Estoy tratando de hacer que esto funcione desde un UIAertControl; una opción es presentar el selector de imágenes para el navegador de fotos; esto funciona bien y la otra es presentar para la cámara; esto no. un UIALertController?
SimonTheDiver
3
No inicializo la cámara en viewDidAppear / Load. Tengo una vista de mesa y abro la cámara en respuesta a una de las opciones de vista de mesa. Y recibo este mensaje de error. ¿Algunas ideas?
Henning
18

Este error también me apareció con el proyecto de código de muestra PhotoPicker de Apple.

Estaba usando Xcode versión 5.0 y iOS 7.0.3 en un iPhone 4.

Pasos para reproducir:

  1. Descargue el proyecto de muestra PhotoPicker de Apple en https://developer.apple.com/library/ios/samplecode/PhotoPicker/Introduction/Intro.html

  2. En APLViewController.m comentar la línea 125

    //imagePickerController.showsCameraControls = NO;

  3. En APLViewController.m comentar 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;

  4. Cree y ejecute la aplicación.

  5. Una vez iniciado, gire el dispositivo al modo horizontal.

  6. Haga clic en el icono de la cámara para abrir UIImagePickerController en el modo de cámara.

  7. 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 pantalla.

Propiedad showsCameraControls

El problema me ocurre cuando esto tiene un valor de SÍ (el predeterminado).

Establecer esto en NO eliminó el mensaje.

Informe de error

Acabo de presentar un informe de error a Apple.

He probado muchas de las sugerencias que se han hecho en diferentes publicaciones, pero no he encontrado una solución alternativa satisfactoria.

Scott Carter
fuente
1
¿Cómo te respondió Apple? Tengo el mismo problema y las soluciones en stackoverflow no funcionan.
heekyu
Todavía no he tenido noticias de Apple sobre esto. Publicaré una respuesta si recibo una respuesta de ellos.
Scott Carter
¿Alguna noticia de Apple? @ScottCarter
Benjamin Toueg
1
Sólo lo comprobé de nuevo. No hay acción sobre el error abierto desde que se presentó el 2 de noviembre de 2013.
Scott Carter
Este es el error 15377241 en bugreport.apple.com
Scott Carter
11

Tuve el problema cuando intenté 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 que cambié la presentación de la vista de la cámara a pantalla completa como se describe en Cómo tomar fotografías y películas, la biblioteca para desarrolladores de iOS todo salió bien nuevamente y el mensaje nunca volvió a aparecer. Sin embargo, tenía que asegurarme de que, dependiendo del modo en que se encuentre la aplicación (es decir, presentando la vista de la cámara o el rollo de fotos), tenía que descartar el popover o el controlador de vista cada vez que - (void) imagePickerControllerDidCancel: (UIImagePickerController *) pickerse llamaba al método .

Arne
fuente
3
cameraUI.modalPresentationStyle = UIModalPresentationFullScreen; funciona para mi. Es lo único que ha tenido éxito aquí. ¡Gracias!
daveMac
2
¡Finalmente! He tenido este problema muchas veces y nunca encontré una buena solución. Siéntete tan estúpido ahora por no mirar más hacia abajo en los hilos de preguntas: imagePicker.modalPresentationStyle = UIModalPresentationFullScreen; resolvió esto por mí. Esta debería ser la respuesta aceptada :)
woobione
6

crear una propiedad

@property (nonatomic) UIImagePickerController *imagePickerController;

Luego

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

Asfanur
fuente
3
picker.modalPresentationStyle = UIModalPresentationCurrentContext; hizo la diferencia para mí.
Mr. Berna
1
Funciona la primera vez que se presenta el selector, pero después vuelve la advertencia.
daveMac
confirmo picker.modalPresentationStyle = UIModalPresentationCurrentContext; Me resuelve el problema de los diseños incorrectos en iOS 8
João Nunes
No funciona para mí: se agregó esto a una acción de UIButton en iOS 8.1.3
Andy
Esto parecía prometedor, pero no me ayudó con el problema de las instantáneas Y mostró un marco inútil alrededor de una parte de la imagen después de que se tomó una foto.
dibujó ..
4

Usé 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];
}
Germán Marquès
fuente
1
Si bien la idea funciona en teoría, desafortunadamente los controles mostrados no funcionan o aparecen correctamente.
daveMac
Y tampoco eliminó la advertencia (al menos para mí)
Ege Akpinar
3

Tengo el mismo problema y encontré una solución. Creo que ese error está relacionado con la orientación de su aplicación. Mi aplicación usa 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 Destino-> General, o archivo .plist: Orientaciones de interfaz compatibles: Horizontal izquierda, Horizontal derecha.

2) Agregue AppDelegate.m:

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

Después de este paso, UIImagePickerController funciona correctamente, pero mis controles de vista se pueden girar al modo vertical. Entonces, para resolver esto:

3) Cree una categoría para UINavigationController, (supportedInterfaceOrientations se movió 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.

Roman Ermolov
fuente
1
Estoy arreglando una aplicación en modo retrato que da el error mencionado en OP. Por tanto, parecería que su solución no es de aplicación universal.
JohnK
¿Intentó agregar el bloque try-catch a main.m e imprimir una excepción y stacktrace?
Roman Ermolov
Al igual que este ?
JohnK
@JohnK sí, así.
Roman Ermolov
3

Recibo este error al compilar la aplicación con iOS SDK 6.1, el objetivo de implementación iOS 6.1 y ejecutar la aplicación en un iPhone con iOS 7. La aplicación no falla, pero el UIViewController shouldAutorotatemétodo de implementación me ayuda a eliminar el mensaje de error.

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

Tuve el mismo problema cuando intentaba modificar la aplicación de demostración que viene con el SDK de Avirary , en la aplicación de demostración, solo puede editar la foto seleccionada del carrete de la cámara. Para intentar 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 ejecuto la aplicación, se produjo 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, modifique el delegado de 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!

Tony
fuente
1

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 cause make imagePickercomo variable global.

JerryZhou
fuente
1

Esto es lo que me solucionó en mi aplicación, mmm

Primero, es una aplicación para iPhone - iPad

en appname-Info.plist. en las orientaciones de interfaz compatibles (iPad) mostró 4 orientaciones.

en las orientaciones de interfaz admitidas se muestran 3 orientaciones. Agregué el cuarto y ejecuté la aplicación, sin salida de depuración.

Espero que esto ayude.

usuario1045302
fuente
0

Acabo de encontrar el mismo problema. En mi caso, el problema fue que tenía un código que no era ARC y lo había migrado a ARC. Cuando hice la migración, no tenía una fuerte referencia al UIImagePickerControllery esa fue la razón del bloqueo.

Espero eso ayude :)

arturgrigor
fuente
0

Tuve el mismo problema en iOS 8, pero el acceso a la cámara estaba deshabilitado dentro de Configuración -> Privacidad para mi aplicación. Simplemente lo habilité y estaba funcionando.

BhushanVU
fuente
0

Pasé mucho tiempo tratando de encontrar la solución, y sorprendentemente la encontré al final y fue muy divertido una vez que la descubrí.

Esto es lo que hará para recuperar la imagen que eligió y reanudar el trabajo :)

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

Sí, para resolver el problema, solo necesita descartar el selector normalmente, ya que parece este mensaje: "Hacer una instantánea de una vista que no se ha procesado da como resultado una instantánea vacía. Asegúrese de que su vista se haya procesado al menos una vez antes de la instantánea o la instantánea posterior actualizaciones de pantalla ". evita que el selector responda, pero puede descartarlo y recuperar la imagen normalmente.

DevSherif
fuente
0

En mi caso, estaba relacionado con un cambio de diseño: el VC que presenta UIImagePickerViewControllertiene la barra de estado oculta, pero no la UIImagePickerViewControllertiene.

Entonces, lo resolví ocultando la barra de estado en el UIImagePickerViewControllercomo se muestra en esta respuesta .

kanobius
fuente
-1

Sin responder directamente a su pregunta, pero mencionó que tenía una advertencia de memoria, es posible que esté almacenando la imagen sin procesar en una propiedad que puede llevar a una advertencia de memoria. Esto se debe a que la imagen sin procesar ocupa aproximadamente 30 MB de memoria. Noté una advertencia de memoria similar al probar 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.

DevC
fuente
-5

Cambiando

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

a

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

solucionó el problema para mí.

Yuki
fuente