2012-10-04 35 views
5

Al actualizar mi aplicación al estándar iOS6, el retrato/paisaje desapareció. Ir funcionó a la perfección cuando estaba compilando con Xcode 3. Pero ahora, al utilizar el último Xcode y el último SDK, la rotación se ha ido y siempre está en modo retrato. No importa lo que ponga en "Orientaciones de interfaz compatibles". Y el código que usé para obtener la rotación antes parece no tener ningún efecto. Tenía estas líneas.Modo retrato y paisaje en iOS6

- (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)toInterfaceOrientation 
{ 
    switch (toInterfaceOrientation) { 
     case UIInterfaceOrientationPortrait: 
     case UIInterfaceOrientationLandscapeLeft: 
     case UIInterfaceOrientationLandscapeRight: 
      return YES; 
     default: 
      return NO; 
    } 
} 

¿Cómo cambio y qué cambio para que funcione nuevamente?

+0

Pruebe esto. Se trabajó para mí: http://stackoverflow.com/questions/10096672/uiwindows-root-view-controller-does-not-rotate-to-landscape-at-app-launch –

Respuesta

17

Antes que nada, en AppDelegate, escriba esto. Esto es muy IMP

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

Entonces, para UIViewControllers, en las que necesita el modo de retrato solamente, escribir estas funciones

- (BOOL)shouldAutorotate 
{ 
    return YES; 
} 

- (NSUInteger)supportedInterfaceOrientations 
{ 
    return (UIInterfaceOrientationMaskPortrait); 
} 

Para UIViewControllers, que requieren PAISAJE también, cambiar de enmascarar para Todos.

- (NSUInteger)supportedInterfaceOrientations 
{ 
    return (UIInterfaceOrientationMaskAllButUpsideDown); 
    //OR return (UIInterfaceOrientationMaskAll); 
} 

Ahora, si desea hacer algunos cambios cuando la orientación cambie, utilice esta función.

- (void)willRotateToInterfaceOrientation:(UIInterfaceOrientation)toInterfaceOrientation duration:(NSTimeInterval)duration 
{ 

} 

EDIT:

mucho depende de con qué controlador es su UIViewController incrustado en

Por ejemplo, si su UINavigationController el interior, entonces puede que tenga que subclase que UINavigationController para anular la orientación. métodos como este.

UINavigationController subclasificado (el controlador de vista superior de la jerarquía tomará el control de la orientación.) Lo configuró como self.window.rootViewController.

- (BOOL)shouldAutorotate 
{ 
    return self.topViewController.shouldAutorotate; 
} 
- (NSUInteger)supportedInterfaceOrientations 
{ 
    return self.topViewController.supportedInterfaceOrientations; 
} 

Desde iOS 6, se da que UINavigationController no le pedirá sus UIViewControllers para el apoyo de orientación. Por lo tanto, necesitaríamos subclasificarlo.

+0

parece un buen enfoque pero lamento decir que no funciona en mi antiguo proyecto, sin importar cómo presiono los botones, Orientaciones de interfaz compatibles o no. Y en un nuevo proyecto tampoco parece funcionar. Me pregunto qué estoy haciendo mal aquí. –

+0

Verificar respuesta EDITADA. En realidad, yo también estaba enfrentando un problema similar que se solucionó. – mayuur

+0

Pondrá a prueba lo que diga. Pero mientras tanto logré que la rotación funcione estableciendo estas líneas en delegate, self.window.rootViewController = self.navigationController; y la rotación funciona de acuerdo con la "selección de botones", pero cómo hacer que ViewControllers siempre estén en vertical. Todavía no entiendo –

1

No sé si su problema fue similar pero conmigo, la barra de estado se orientó correctamente (horizontal) y se representó el UIViewController. me cambió siguiente línea en la aplicación de delegado aplicación: didFinishLaunchingWithOptions:

//[window addSubview:navigationController.view]; 

self.window.rootViewController = navigationController; 

de Apple => esto me costó un día y medio para descubrir, y una gran cantidad de dinero !!!

6

Como apoyar uno o más controladores de paisaje en aplicación que es retrato principalmente en iOS6:

1) en AppDelegate

- (NSUInteger)application:(UIApplication *)application supportedInterfaceOrientationsForWindow:(UIWindow *)window 
    { 
     UINavigationController* ns = (UINavigationController*)self.window.rootViewController; 
     if (ns) { 
      UIViewController* vc = [ns visibleViewController]; 
//by this UIViewController that needs landscape is identified 
      if ([vc respondsToSelector:@selector(needIos6Landscape)]) 
       return [vc supportedInterfaceOrientations]; 

     } 
     return UIInterfaceOrientationMaskPortrait; //return default value 
    } 

2) en el controlador (s) UIView que necesita paisaje (o retrato + paisaje, etc.):

//flag method 
-(void)needIos6Landscape { 
} 
- (BOOL)shouldAutorotate 
{ 
    return YES; 
} 
- (NSUInteger)supportedInterfaceOrientations 
{ 
    return UIInterfaceOrientationMaskAllButUpsideDown; 
} 

3) en los controladores, a la que se puede volver a los controladores, que se puede girar en el paisaje - esto es importante, de lo contrario remaind paisaje a la vuelta de VC habilitado para paisaje.

- (BOOL)shouldAutorotate 
{ 
    return YES; 
} 
- (NSUInteger)supportedInterfaceOrientations 
{ 
    return UIInterfaceOrientationMaskPortrait; 
} 

4) (tal vez no sea necesario, pero seguro ..) - control de navegación subclase (s) que utiliza, y añade:

- (BOOL)shouldAutorotate 
{ 
    return YES; 
} 
- (NSUInteger)supportedInterfaceOrientations 
{ 
    UIViewController* vc = [self visibleViewController]; 
    if (vc) { 
     if ([vc respondsToSelector:@selector(needIos6Landscape)]) { 
      return [vc supportedInterfaceOrientations]; 
     } 
    } 
    return UIInterfaceOrientationMaskPortrait; 
} 

El paso importante es para pedir orientación únicos controladores desde su aplicación, porque durante la transición entre los controladores, durante algún tiempo hay algún controlador de sistema como raíz, y devolverá un valor incorrecto (esto me llevó 2 horas averiguarlo, era la razón por la que no funcionaba).

Cuestiones relacionadas