Cada vista empujado sobre la navegación de los controladores de la pila tiene que soportar las mismas orientaciones. Esto significa que no es posible tener algunos controles de vista que solo admitan retrato y otros que solo admitan paisaje.En otras palabras, todos los controladores de vista sobre la misma pila de mando de navegación debe devolver la misma en el delegado:
(BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation
Pero hay una solución simple para esto! Aquí hay un ejemplo para pasar de retrato a paisaje. Aquí están los pasos para hacerlo y debajo está el código para apoyarlo.
- Crea un controlador de vista "falso" que se enrutará en un controlador secundario de navegación. Este controlador de vista debe ser compatible con el paisaje.
- crear una nueva instancia de un
UINavigationController
, añadir una instancia del controlador de 'falso' Ver como raíz y una instancia de su controlador de vista paisaje como segundo controlador de vista
- presente la instancia
UINavigationController
como modal desde el controlador de vista padre
en primer lugar, crear un nuevo controlador de vista (FakeRootViewController) con este código:
@interface FakeRootViewController : UIViewController
@property (strong, nonatomic) UINavigationController* parentNavigationController;
@end
@implementation FaceRootViewController
@synthesize parentNavigationController;
// viewWillAppear is called when we touch the back button on the navigation bar
(void)viewWillAppear:(BOOL)animated {
// Remove our self from modal view though the parent view controller
[parentNavigationController dismissModalViewControllerAnimated:YES];
}
(BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation {
return (interfaceOrientation == UIInterfaceOrientationIsLandscape(interfaceOrientation));
}
Aquí está el código para presentar el controlador de vista que desea mostrar en el modo de paisaje:
FakeRootViewController* fakeRootViewController = [[FakeRootViewController alloc] init];[fakeRootViewController.navigationItem setBackBarButtonItem:backButton]; // Set back button
// The parent navigation controller is the one containing the view controllers in portrait mode.
fakeRootViewController.parentNavigationController = parentNavigationController;
UINavigationController* subNavigationController = // Initialize this the same way you have initialized your parent navigation controller.
UIViewController* landscapeViewController = // Initialize the landscape view controller
[subNavigationController setViewControllers:
[NSArray arrayWithObjects:fakeRootViewController,
landscapeViewController, nil] animated:NO];
[_navigationController presentModalViewController:subNavigationController animated:YES];
Recuerde que el landscapeViewController también debe tener esta aplicación:
(BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation {
return (interfaceOrientation == UIInterfaceOrientationIsLandscape(interfaceOrientation));
}
¿podría compartir el código de muestra? –