¿Por qué no puedo forzar la orientación horizontal cuando uso UINavigationController?

Encuentro muchas preguntas para forzar a UIViewController a paisajismo como predeterminado: Cómo forzar a UIViewController a la orientación vertical en iOS 6 Y prueba esto:

- (BOOL)shouldAutorotate { return YES; } -(NSUInteger)supportedInterfaceOrientations { return UIInterfaceOrientationMaskLandscape; } - (UIInterfaceOrientation)preferredInterfaceOrientationForPresentation { return UIInterfaceOrientationLandscapeLeft; } 

Pero cuando uso UIViewController dentro de UINavigationController, no puedo forzar al paisaje. ¡Por favor ayuda!

* El trabajo NO está bien

 - (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions { self.window = [[UIWindow alloc] initWithFrame:[[UIScreen mainScreen] bounds]]; self.viewController = [[ViewController alloc] initWithNibName:@"ViewController" bundle:nil]; UINavigationController *navControl = [[UINavigationController alloc] initWithRootViewController:self.viewController]; [navControl setNavigationBarHidden:YES]; self.window.rootViewController = navControl; [self.window makeKeyAndVisible]; return YES; } 

* Trabaja bien:

 self.window.rootViewController = self.viewController; 

La mejor forma de hacerlo es crear el comando UINavigationController extend y escribir su función de orientación dentro de la clase extendida.

Declaración de clase:

 @interface MyNavigationControllerViewController : UINavigationController @property(nonatomic, assign) UIInterfaceOrientation orientation; @property(nonatomic, assign) NSUInteger supportedInterfaceOrientatoin; @end 

Implementación de MyNavigationController

 @implementation MyNavigationController @synthesize supportedInterfaceOrientatoin = _supportedInterfaceOrientatoin; @synthesize orientation = _orientation; - (id)initWithNibName:(NSString *)nibNameOrNil bundle:(NSBundle *)nibBundleOrNil { self = [super initWithNibName:nibNameOrNil bundle:nibBundleOrNil]; if (self) { // Custom initialization _supportedInterfaceOrientatoin = UIInterfaceOrientationMaskLandscape; _orientation = UIInterfaceOrientationLandscapeLeft; } return self; } - (void)viewDidLoad { [super viewDidLoad]; // Do any additional setup after loading the view. } - (void)didReceiveMemoryWarning { [super didReceiveMemoryWarning]; // Dispose of any resources that can be recreated. } - (BOOL)shouldAutorotate { return YES; } -(NSUInteger)supportedInterfaceOrientations { return _supportedInterfaceOrientatoin; } - (UIInterfaceOrientation)preferredInterfaceOrientationForPresentation { return self.orientation; } @end 

y utilice su controlador de navegación como MyNavigationController extendido como su controlador de navegación de la raíz.

 @interface AppDelegate : UIResponder  @property (strong, nonatomic) UIWindow *window; @property (strong, nonatomic) ViewController *viewController; @property (strong, nonatomic) MyNavigationControllerViewController *myNavController; - (void) reloadAppDelegateRootViewControllerLandscape; - (void) reloadAppDelegateRootViewController; @end 

Así que su delegado de la aplicación didfinishlounchingwithoptions code será el siguiente.

 - (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions { self.window = [[UIWindow alloc] initWithFrame:[[UIScreen mainScreen] bounds]]; self.viewController = [[ViewController alloc] initWithNibName:@"ViewController" bundle:nil]; self.myNavController = [[MyNavigationController alloc] initWithRootViewController:self.viewController]; [self.myNavController setNavigationBarHidden:YES]; self.window.rootViewController = self.myNavController; [self.window makeKeyAndVisible]; return YES; } 

La única forma en que puede proporcionar una orientación diferente para dos vistas diferentes con el mismo controlador de navegación es volver a cargar el controlador de navegación. Entonces, si agrega dos métodos

 - (void) reloadAppDelegateRootViewController{ [[[UIApplication sharedApplication].delegate window] setRootViewController:nil]; [(MyNavigationControllerViewController *)self.myNavController setOrientation:UIInterfaceOrientationPortrait]; [(MyNavigationControllerViewController *)self.myNavController setSupportedInterfaceOrientatoin:UIInterfaceOrientationMaskAll]; [[[UIApplication sharedApplication].delegate window] setRootViewController:self.myNavController]; } - (void) reloadAppDelegateRootViewControllerLandscape{ [[[UIApplication sharedApplication].delegate window] setRootViewController:nil]; [(MyNavigationControllerViewController *)self.myNavController setOrientation:UIInterfaceOrientationLandscapeLeft]; [(MyNavigationControllerViewController *)self.myNavController setSupportedInterfaceOrientatoin:UIInterfaceOrientationMaskLandscape]; [[[UIApplication sharedApplication].delegate window] setRootViewController:self.myNavController]; } 

y llame a estas funciones después de presionar y abrir vistas.

Nota: – No sé si es una buena o mala manera.

Necesitas ir a tu archivo plist y configurar las orientaciones. También puedes hacer esto en tu archivo de proyecto. Sin embargo, la configuración de orientaciones plist se anulará.

En su lista, puede establecer ambas opciones de orientación en el botón de paisaje hacia la izquierda y el botón de paisaje hacia la derecha.