orientation landscape ios6

orientation - Se bloquea al presentar UIImagePickerController en iOS 6.0



landscape ios6 (5)

Mi aplicación solo admite orientaciones de paisaje a través de las propiedades supportedInterfaceOrientation InterfiereOrientation.

Utilizando un iOS anterior a iOS 6, mi aplicación puede cargar con éxito una instancia de UIImagePickerController través de presentViewController:animated:completion: aunque el UIImagePickerController solo admite la orientación vertical.

El selector de imágenes simplemente se presentó de lado al usuario. El usuario rotó el teléfono, seleccionó su imagen y luego lo giró de vuelta a horizontal.

En iOS 6.0, llamar a presentViewController:animated:completion: con la instancia de UIImagePickerController bloquea la aplicación. Puedo evitar el bloqueo agregando opciones de retrato a mis propiedades supportedInterfaceOrientation .

Sin embargo, operar en vertical realmente no tiene sentido para mi aplicación. Pensé que podría utilizar shouldAutorotateToInterfaceOrientation para permitir que la aplicación "compatible con el retrato", pero solo se le permita rotar al retrato en esta vista única. Pero ahora ese método está en desuso, y no puedo usar la misma técnica con shouldAutorotate.

¿Alguien tiene alguna idea de cómo puedo solucionar este problema en iOS 6.0?


iOS 6.1 - arreglado

A partir de iOS 6.1, esto ya no ocurre , es muy importante seguir mis consejos para evitar un bloqueo en iOS 6.0.x, lo que sigue se aplica a eso.

Solución para iOS 6.0.x

Esto es en realidad un error en iOS 6.0, esto debería corregirse en futuras versiones de iOS.

Un ingeniero de Apple ha explicado este error y una solución alternativa aquí: https://devforums.apple.com/message/731764

Esto está sucediendo porque la aplicación solo quiere orientación horizontal, pero algunos controladores Cocoa Touch View requieren una orientación estrictamente vertical, que es el error; no es que requieran más que Portrait, sino su interpretación de los requisitos de las aplicaciones.

Un ejemplo de esto puede ser el siguiente:

La aplicación iPad que admite paisajes solo muestra un UIImagePickerController a través de un UIPopoverController. El UIImagePickerController requiere orientación Vertical, pero la aplicación solo está forzando el paisaje. Error y ... bloqueo

Otros marcos que se han reportado como problemáticos incluyen el controlador de vista de inicio de sesión de Game Center.

La solución es bastante simple pero no ideal ... Mantiene las orientaciones correctas declaradas en su panel info.plist / project info, pero en la clase Application Delegate declara que permite todas las orientaciones.

Ahora cada controlador de vista que agregue a la ventana debe especificarse a sí mismo que solo puede ser horizontal. Por favor, consulte el enlace para más detalles.

No puedo enfatizar cuánto debe no estar subclasificando UIImagePickerController ya que la solución aceptada es insistir en que lo haga.

Lo importante aquí es " Esta clase está destinada a ser tal como está y no admite subclases ".

En mi caso, agregué esto al delegado de mi aplicación (tengo una aplicación de solo paisaje), esto le dice al selector de imágenes que puede mostrar, porque portrait es compatible:

- (NSUInteger)application:(UIApplication *)application supportedInterfaceOrientationsForWindow:(UIWindow *)window{ return UIInterfaceOrientationMaskAll; }

Y luego en mi controlador de vista que resultó ser un UINavigationController , UINavigationController una categoría con lo siguiente:

- (NSUInteger)supportedInterfaceOrientations{ return UIInterfaceOrientationMaskLandscape; }

Ahora mi aplicación no gira, y el selector de imágenes le pregunta al delegado si puede mostrar como retrato y se dice que está bien. Entonces todo funciona bien.


Informes desde iOS 7.1:

Además de lo que especifican las respuestas anteriores, parece que tiene que habilitar absolutamente los modos de retrato en el info.plist.

Sin esto ninguno de los códigos / correcciones anteriores funcionó para mí.


Mientras que subclassing UIImagePickerController funciona, una categoría es una mejor solución:

@implementation UIImagePickerController (NonRotating) - (BOOL)shouldAutorotate { return NO; } -(UIInterfaceOrientation)preferredInterfaceOrientationForPresentation { return UIInterfaceOrientationPortrait; } @end


Tuve un problema similar, pero en una aplicación de paisaje iPad. Estaba presentando el selector de imágenes en un popover. Se estrelló en iOS 6. El error sugería que el selector quería un retrato, pero la aplicación solo ofrecía vistas del paisaje, y ... lo que es más importante ... el rotulador debería regresar SI.

Agregué esto a mi ViewControllerClass.m que está creando el selector

@interface NonRotatingUIImagePickerController : UIImagePickerController @end @implementation NonRotatingUIImagePickerController - (BOOL)shouldAutorotate { return NO; } @end

y luego usó esa clase en su lugar

UIImagePickerController *imagePicker = [[NonRotatingUIImagePickerController alloc] init]; [myPopoverController setContentViewController:imagePicker animated:YES];

Eso resolvió el problema para mí. Tu situación es un poco diferente, pero básicamente es el mismo error.


-(NSUInteger)supportedInterfaceOrientations { return UIInterfaceOrientationMaskLandscape; }

Arreglará el problema pero desde iOs7