Почему я не могу форсировать ландшафтную ориентацию при использовании UINavigationController?
Я нахожу много вопросов, чтобы заставить UIViewController ландшафтировать по умолчанию: как принудить UIViewController к портретной ориентации в iOS 6 И попробуйте вот что:
- (BOOL)shouldAutorotate
{
return YES;
}
-(NSUInteger)supportedInterfaceOrientations
{
return UIInterfaceOrientationMaskLandscape;
}
- (UIInterfaceOrientation)preferredInterfaceOrientationForPresentation
{
return UIInterfaceOrientationLandscapeLeft;
}
Но когда я использую UIViewController внутри UINavigationController, я не могу заставить ландшафт.Пожалуйста, помогите!
* Работа не в порядке
- (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;
}
* Работа в порядке:
self.window.rootViewController = self.viewController;
2 ответа:
Лучший способ сделать это-создать расширенный UINavigationController и написать свою функцию ориентации внутри расширенного класса.
Объявление Класса:
@interface MyNavigationControllerViewController : UINavigationController @property(nonatomic, assign) UIInterfaceOrientation orientation; @property(nonatomic, assign) NSUInteger supportedInterfaceOrientatoin; @end
Реализация 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
И используйте свой расширенный like MyNavigationController в качестве навигационного контроллера для вашего rootviewcontroller.
@interface AppDelegate : UIResponder <UIApplicationDelegate> @property (strong, nonatomic) UIWindow *window; @property (strong, nonatomic) ViewController *viewController; @property (strong, nonatomic) MyNavigationControllerViewController *myNavController; - (void) reloadAppDelegateRootViewControllerLandscape; - (void) reloadAppDelegateRootViewController; @end
Таким образом, ваш делегат приложения didfinishlounchingwithoptions будет выглядеть следующим образом.
- (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; }
Только так вы можете обеспечить разные ориентация для двух различных видов с одним и тем же навигационным контроллером isto перезагрузить сам навигационный контроллер. Поэтому, если вы добавите два метода
- (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]; }
И вызовите эти функции после нажатия и всплывающих представлений.
Примечание:- Я не знаю, является ли это хорошим способом или плохим способом.