iOS 7 UIImagePicker vista previa de la pantalla en negro

Cuando bash cargar la camera desde mi código, la vista previa de la camera es negra. Si espero 10-20 segundos, se mostrará una vista previa real de la camera. Encontré varias preguntas y algunas sugieren que ejecutar otro código en segundo plano debería ser la razón de esto. Sin embargo, no tengo ningún código ejecutándose en segundo plano. ¿Cómo debería arreglar esto?

Este es mi código donde ejecuto la camera

UIImagePickerController *photoPicker = [[UIImagePickerController alloc] init]; photoPicker.delegate = self; photoPicker.sourceType = UIImagePickerControllerSourceTypeCamera; [self presentViewController:photoPicker animated:YES completion:NULL]; 

Hace aproximadamente 5 meses, mi equipo descubrió una pérdida de memory con UIImageViewController en iOS7. Cada instanciación ralentizó la aplicación exponencialmente (es decir, primero alloc-init tuvo una demora de 1 segundo, la segunda tuvo una demora de 2 segundos, la tercera tuvo una demora de 5 segundos). Eventualmente, teníamos 30-60 demoras (similar a lo que estás experimentando).

Resolvimos el problema subclarando UIImagePickerController y convirtiéndolo en un Singleton. De esa manera, solo se inicializó una vez. Ahora nuestra demora es mínima y evitamos la fuga. Si la subclass no es una opción, pruebe una propiedad de class en su viewController y solo cargue perezoso.

 -(UIImagePickerController *)imagePicker{ if(!_imagePicker){ _imagePicker = [[UIImagePickerController alloc]init]; _imagePicker.sourceType = UIImagePickerControllerSourceTypeCamera; } return _imagePicker; } 

Entonces puedes llamarlo más tarde como:

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

Tenía esto yo mismo – sucede si algo se está ejecutando en el hilo de envío principal – ¿estás cambiando el tamaño de las imágenes por casualidad?

Pone la vista previa en el hilo principal y si algo está usándolo, obtienes una pantalla en negro. Es un error y la solución es tomar el hilo principal o deshabilitar el selector de fotos hasta que la queue esté libre

Esto debería funcionar para usted:

  - (void)cameraViewPickerController:(UIImagePickerController *)picker { [self startCameraControllerFromViewController: picker usingDelegate: self]; } - (BOOL) startCameraControllerFromViewController: (UIViewController*) controller usingDelegate: (id <UIImagePickerControllerDelegate, UINavigationControllerDelegate>) delegate { if (([UIImagePickerController isSourceTypeAvailable: UIImagePickerControllerSourceTypeCamera] == NO) || (delegate == nil) || (controller == nil)) return NO; UIImagePickerController *cameraUI = [[UIImagePickerController alloc] init]; cameraUI.sourceType = UIImagePickerControllerSourceTypeCamera; // Displays a control that allows the user to choose movie capture cameraUI.mediaTypes = [[NSArray alloc] initWithObjects: (NSString *) kUTTypeImage, (NSString *) kUTTypeMovie,nil]; // Hides the controls for moving & scaling pictures, or for // trimming movies. To instead show the controls, use YES. cameraUI.allowsEditing = NO; cameraUI.delegate = delegate; [controller presentViewController:cameraUI animated:YES completion:nil]; return YES; }