2012-10-10 41 views
7

Para mi aplicación rootViewController es navgationController.iOS 6 - (BOOL) shouldAutorotate no se llama para los controladores de navegación empujó viewControllers

me encontré con que empujado de controlador

-(BOOL)shouldAutorotate no está recibiendo llamadas.

y

-(NSUInteger)supportedInterfaceOrientations ser llamado una sola vez.

He comprobado correctamente en xcode's resumen del proyecto (o plist) para todas las orientaciones de Windows.

Quiero que se llamen estos métodos, ya que hay algún código de posicionamiento uicontrol que quiero ejecutar programáticamente para el cambio de orientación.

I resuelto este problema reemplazando (categoría) siguientes métodos de control de navegación

-(BOOL)shouldAutorotate; 

-(NSUInteger)supportedInterfaceOrientations; 

I controlados, que controlador está de ser empujado y, en consecuencia llamado código posicionamiento uicontrol respectiva del controlador empujado en el método siguiente de controlador de navegación

(NSUInteger)supportedInterfaceOrientations; 

Esto está funcionando bien pero no creo que esta sea la forma correcta. Por favor, ayúdenme para una mejor solución.

+0

En mi caso (como he publicado http://stackoverflow.com/questions/12610132/multiple-uiinterfaceorientations-app-with-ios-6) yo no era capaz para tratar con presentModalViewControllers, pero pushViewController funcionó bien – jMelnik

Respuesta

0

puede comprobar la orientación interfaz a través de

[UIApplication sharedApplication].statusBarOrientation 

cuando se carga el controlador de vista, por ejemplo, en viewWillAppear. Allí puedes hacer tu diseño de las subvistas. Una vez que la vista está activa, se llamará al shouldAutorotate cada vez que se enciende el dispositivo.

+0

Pero tenga en cuenta que supportedInterfaceOrientations solo se llamará una vez –

+0

No, lo siento. Acabo de probar esto en un proyecto nuevo. Cada vez que doy vuelta, ambos métodos son llamados exactamente una vez. – Mundi

0

Anular UINavigationController es el enfoque correcto, pero no estoy seguro de si está comprobando que los controladores push sean compatibles con InterfiereOrientations de la forma correcta.

Mira mi respuesta aquí: https://stackoverflow.com/a/12669343/253008

+0

No, estoy comprobando que los controladores push admitidosInterfaceOrientations sea el correcto. Todo está funcionando correctamente como se esperaba. Solo quiero saber si hay alguna otra alternativa para la solución que encontré (métodos de anulación) para que los controladores empujados - (BOOL) shouldAutorotate; - (NSUInteger) supportedInterfaceOrientations; se llamará de manera automática siempre que cambie la orientación. Así que puedo omitir el control de qué controlador se presiona y llamando a su código de reposicionamiento de UIControl según el método reemplazado. Como este código de reposicionamiento de UIControl ya está allí en los métodos de orientación de los controladores. –

27

Puede consultar el siguiente enlace, es necesario crear un desplazamiento personalizado de apoyo debe girar automática

http://mobileappdevpage.blogspot.in/2012/11/how-to-use-should-autorotateios-6-with.html

La otra forma en que puede hacer esto la creación de la categoría de UINaviagationController

código para el archivo .h es

@interface UINavigationController (autorotation) 

-(BOOL)shouldAutorotate; 
-(NSUInteger)supportedInterfaceOrientations; 

y el código para el archivo .m es

@implementation UINavigationController (autorotation) 

-(BOOL)shouldAutorotate 
{ 

    UIInterfaceOrientation interfaceOrientation = [UIApplication sharedApplication].statusBarOrientation; 
    [self.topViewController shouldAutorotate]; 
    return YES; 

} 

-(NSUInteger)supportedInterfaceOrientations 
{ 
    return UIInterfaceOrientationMaskAll; 

} 
@end 
+0

Es una publicación muy útil para mí. Gracias, yaar –

+0

bueno, también he resuelto el problema usando esto gracias ... –

+0

@iMobile y Neel gracias –

1

También se enfrentó al mismo problema con el controlador de navegación.Funciona bien en el caso de todos los controladores de vista empujadas, pero mi situación era muy diferente que tenía una viewcontroller oprimido hasta el mando de navegación (ViewControllerParent) como la raíz,

NavController 
      -- rootViewController (ViewControllerParent) 
              --- ViewControllerChild1 
              --- ViewControllerChild2 

Debido a algún requisito proyecto, estaba manteniendo ViewControllerParent como base, y luego estaba agregando la vista de Child viewcontroller como subvistas al padre en función de las acciones del usuario. Ahora tenía un escenario donde quería que Child1 no girara y Child2 tuviera rotación.

El problema al que me enfrenté fue que mi [self.topViewController] en la clase de controlador de navegación siempre me devuelve el objeto primario, ya que no estoy empujando los Childs en la pila de navegación. Entonces mis métodos de AuthorAutorotate en mi Childs nunca serán llamados. Así que tuve que poner una verificación de clase en el método shouldAutorotate de mi padre y luego devolver el valor de rotación. hice algo como esto en la clase padre (ViewControllerParent), es una especie de solución, pero que fija el problema

-(BOOL)shouldAutorotate 
{ 
    BOOL allowRotation = YES; 

    if ([currentlyLoadedChild isKindOfClass:[Child1 class]]) 
    { 
     allowRotation = NO; 
    } 
    if ([currentlyLoadedChild isKindOfClass:[Child2 class]]) 
    { 
     allowRotation = YES; 
    } 
    return allowRotation; 
} 

-anoop

0

que tenía el mismo problema. comprobar this answer es un gran approauch en lugar de aplicar ShouldAutoRotate

Cuestiones relacionadas