Perché non posso forzare l’orientamento orizzontale quando uso UINavigationController?

Trovo molte domande per forzare UIViewController in orizzontale come predefinito: Come forzare un UIViewController in orientamento verticale in iOS 6 E provare questo:

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

Ma quando uso UIViewController all’interno di UINavigationController, non posso forzare a landscape.Please help!

* Funziona NON ok

 - (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; } 

* Funziona bene:

 self.window.rootViewController = self.viewController; 

Il modo migliore per farlo è creare estendere UINavigationController e scrivere la funzione di orientamento all’interno della class estesa.

Dichiarazione di class:

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

Implementazione di 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 

e usa il tuo esteso come MyNavigationController come controller di navigazione sul tuo rootviewcontroller.

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

Quindi il tuo delegato dell’applicazione ha fatto una procedura di apertura con il codice di opzione come segue.

 - (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; } 

Solo in questo modo è ansible fornire un orientamento diverso per due viste diverse con lo stesso controller di navigazione, quindi ricaricare il controller di navigazione stesso. Quindi se aggiungi due metodi

 - (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]; } 

e chiama queste funzioni dopo aver premuto e visualizzato le viste.

Nota: – Non so se sia un buon modo o un modo sbagliato.

Devi andare al tuo file plist e impostare gli orientamenti. Puoi anche farlo sul tuo file di progetto. Le impostazioni degli orientamenti plistoveranno comunque tutte.

Nel tuo plist puoi impostare entrambe le opzioni di orientamento sul pulsante paesaggio sinistro e orizzontale sul lato destro.