2010-04-29 14 views
6

Recientemente me encontré con un problema. La aplicación de mi iPad impide de alguna manera que el iPad se gire automáticamente. Mi aplicación carga un UISplitView con ambos controladores de vista devolviendo SÍ para shouldAutorotateToInterfaceOrientation :. He configurado my info.plist para que incluya la clave "Orientaciones de interfaz admitidas" con las cuatro orientaciones. Sin embargo, cuando ejecuto la aplicación, girar el dispositivo no rota la vista dividida (aunque recibo UIDeviceOrientationDidChangeNotification). Además, cuando salgo de mi aplicación con una orientación diferente que comenzó en la pantalla de inicio del iPad, no giró automáticamente a la vista correcta hasta que la gire de nuevo sin que mi aplicación se ejecute ... Cualquier idea sería muy apreciada ...UiSplitViewController no autorrota

Respuesta

8

UISplitViewController es una de las subclases de controlador de vista más temperamentales que he tenido que usar. Para que funcione "perfectamente", debe existir como una sola vista de raíz en la ventana de su aplicación. Sin embargo, puedes evitar esto con algún truco: en mi caso, necesitaba un UITabBarController con al menos dos UISplitViewController como controladores de vista, pero luego tienes que encargarme de casos extraños que impliquen rotación y devoluciones de llamada UISplitViewControllerDelegate sin disparar .

Aquí está la esperanza de que Apple hace UISplitViewController más compatibles con otros componentes UIKit en el futuro ...

+1

Puedes evitarlo con engaños ... ¿Qué truco? ¡Te tomas el pelo! – radven

+0

A lo que se redujo fue a reenviar manualmente los métodos de rotación apropiados. Registrando un montón de cosas para ver qué métodos eran y no nos llaman. Luego compensé en mi subclase de controlador de vista raíz asegurándome de que los controladores de vista secundarios obtuvieran los métodos correctos activados, cambiaran el tamaño de sus vistas, etc. – LucasTizma

+0

Tengo el mismo problema en este momento de tener mis controles SplitViewController, que son pestañas bajo un TabBarController, ¡actúa errático, así que está contento de saber que no soy solo yo! ¡Gracias por esa comodidad al menos! – Gowiem

0

Usted dijo que su primer problema es que UISplitView le impide autorrotar. Intente utilizar una Subclase de Splitview en lugar de la autorrotación enbales:

@implementation SplitViewControllerRotating 
- (BOOL) shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)toInterfaceOrientation{ 
    NSLog(@"SplitViewControllerRotating shouldAutorotate"); 
    return YES; 
} 
@end 

Su segundo problema suena raro. Dijo que después de salir de su aplicación debe girar, para que su iPad reconozca la orientación de la interfaz. No puedo ayudarte con eso.

+2

Lo probé ... No funcionó ... ¿No es el propósito de UISplitView autorrotar de todos modos? – Michael

+0

¿Alguien sabe una solución en iOS 9? Las respuestas respondidas arriba están en desuso. – vaberer

0

Tuve el mismo problema en este momento. La razón fue que accidentalmente agregué otra vista a la ventana, además de la vista de UISplitViewController. Eliminar la vista adicional lo hizo funcionar.

1

¿Está configurado su UISplitViewController como su controlador de vista raíz? Si no, esa puede ser la causa de tu problema. Estaba teniendo un problema similar: la barra de estado giraría, pero mis detalles y vistas maestras se mantendrían en su lugar. Reorganicé las vistas para que el UISplitViewController fuera la raíz y luego mi 'menú principal' se presentó como un controlador de vista modal en la parte superior de la vista dividida, y se eliminó el problema de rotación.

De acuerdo con la iPad Programming Guide, "La opinión del controlador de vista dividida siempre debe estar instalado como la vista raíz de la ventana de la aplicación."

Espero que esto ayude.

4

me encontré con este mismo problema con dos UINavigationControllers subordinadas. En mi caso, la rotación comenzó a funcionar una vez que reemplacé shouldAutorotateToInterfaceOrientation: en el controlador izquierdo para siempre devolver 'SÍ'.

+2

Tanto el masterView como el detailView necesitan admitir SÍ para cualquier orientación a la que intente rotar. Si ninguno de los dos devuelve SÍ, no girará. Extrañé este detalle sutil, mi retrato solo compatible con masterView. Espero que esto ayude a alguien más. – sasquatch

1

He encontrado que esto funcione bien - siempre que ambos hijos del UISplitViewController aplicar la shouldAutorotateToInterfaceOrientation:

I.e si tiene algo como:

 MasterViewController *masterViewController = [[MasterViewController alloc] initWithNibName:@"MasterViewController_iPad" bundle:nil]; 
     UINavigationController *masterNavigationController = [[UINavigationController alloc] initWithRootViewController:masterViewController]; 

     DetailViewController *detailViewController = [[DetailViewController alloc] initWithNibName:@"DetailViewController_iPad" bundle:nil]; 
     UINavigationController *detailNavigationController = [[UINavigationController alloc] initWithRootViewController:detailViewController]; 

     self.splitViewController.viewControllers = @[masterNavigationController, detailNavigationController]; 

     self.window.rootViewController = self.splitViewController; 

para definir el rootViewController de su NSApplication entonces ambos MasterViewController y DetailViewController deberían aplicar:

(BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)toInterfaceOrientation { 
    return YES; 
} 

como para asegurar que los trabajos de rotación.

Cuestiones relacionadas