TabBarController旋转问题

整个星期,我一直在寻找解决scheme,以解决我的问题,但没有任何工作。 我有一个TabBarController有6个选项卡。 iOS会自动创build“更多”选项卡,其中包含视图控制器“仪表板”,我很难。 “仪表板”视图控制器充当具有3页的页面控制器。

当我按“仪表板”项目时,我希望屏幕方向从纵向更改为横向。 我通过无数其他的SOpost了解到,旋转是由父级TabBarController控制的。 我也了解到,“更多”选项卡实际上是一个导航控制器,它增加了一些复杂的组合。

要重申和直接,当我按TabBarController的“更多”选项卡中的“仪表板”选项卡,我希望屏幕更改其方向从纵向景观。

是的,我已经试过这个: [[UIDevice currentDevice] setValue:[NSNumber numberWithInteger: UIInterfaceOrientationLandscapeLeft]forKey:@"orientation"]; 并没有工作。

我也尝试覆盖TabBarController和MoreNavigationController中的每个函数,这些函数与旋转和方向以及子视图有关。 我将在下面发布我的TabBarController。 任何帮助将不胜感激,谢谢。

TabBarViewController.h:

 @interface TabBarViewController : UITabBarController<UINavigationControllerDelegate>{} @end 

TabBarViewController.m:

 @implementation TabBarViewController - (void)viewDidLoad { [super viewDidLoad]; self.moreNavigationController.delegate = self; } - (BOOL)shouldAutorotate { return YES; } - (NSUInteger)supportedInterfaceOrientations { if([self.selectedViewController isKindOfClass:[Dashboard class]]) { return UIInterfaceOrientationMaskLandscape; } return UIInterfaceOrientationMaskAll; } - (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)toInterfaceOrientation { return YES; } - (NSUInteger)tabBarControllerSupportedInterfaceOrientations:(UITabBarController *)tabBarController { if([tabBarController.selectedViewController isKindOfClass:[Dashboard class]]) { return UIInterfaceOrientationMaskLandscape; } return UIInterfaceOrientationMaskAll; } - (void)tabBarController:(UITabBarController *)tabBarController didSelectViewController:(UIViewController *)viewController { NSLog(@"tabBarController didSelectViewController = %lu", (unsigned long)tabBarController.selectedIndex); } - (NSUInteger)navigationControllerSupportedInterfaceOrientations:(UINavigationController *)navigationController { if([navigationController.topViewController isKindOfClass:[Dashboard class]] || [navigationController.topViewController isKindOfClass:[ViewController1 class]] || [navigationController.topViewController isKindOfClass:[ViewController2 class]] || [navigationController.topViewController isKindOfClass:[ViewController3 class]]) { return UIInterfaceOrientationMaskLandscape; } return UIInterfaceOrientationMaskAllButUpsideDown; } - (UIInterfaceOrientation)navigationControllerPreferredInterfaceOrientationForPresentation:(UINavigationController *)navigationController { NSLog(@"navigationControllerPreferredInterfaceOrientationForPresentation"); if([navigationController.topViewController isKindOfClass:[Dashboard class]] || [navigationController.topViewController isKindOfClass:[ViewController1 class]] || [navigationController.topViewController isKindOfClass:[ViewController2 class]] || [navigationController.topViewController isKindOfClass:[ViewController3 class]]) { return UIInterfaceOrientationLandscapeLeft | UIInterfaceOrientationLandscapeRight; } return UIInterfaceOrientationPortrait|UIInterfaceOrientationMaskLandscapeRight|UIInterfaceOrientationMaskLandscapeLeft; } - (void)navigationController:(UINavigationController *)navigationController willShowViewController:(UIViewController *)viewController animated:(BOOL)animated { if([viewController isKindOfClass:[Dashboard class]]) { [[UIDevice currentDevice] setValue:[NSNumber numberWithInteger: UIInterfaceOrientationLandscapeLeft]forKey:@"orientation"]; } } @end 

更改UITabBarController的方向

虽然也许有几十个,并尝试这个问题,主要问题在于每个UINavigationController的仔细devise,对UITabBarController supportedInterfaceOrientations的正确响应,以及一些强制实现所需方向的代码。

很可能,这可能只是一个iOS错误,因为一旦旋转, UINavBarController和所有embedded的UINavigationController行为都正确。

下面的说法是不正确的 。 标签栏控制器旋转

TabBarControllers不能旋转


为每个UINavigationController设置方向

景观示例:

 class HorizontalNavigationController: UINavigationController { override var supportedInterfaceOrientations : UIInterfaceOrientationMask { return .landscape } } 

肖像示例:

 class VerticalNavigationController: UINavigationController { override var supportedInterfaceOrientations : UIInterfaceOrientationMask { return .portrait } } 

TabBarController方向推迟到选定的视图控制器

 class TabBarController: UITabBarController { override var supportedInterfaceOrientations : UIInterfaceOrientationMask { if let selectedViewController = selectedViewController { return selectedViewController.supportedInterfaceOrientations } return .allButUpsideDown } } 

强化界面方向更改

这是UITabBarController的有争议的方面。 不知何故,方向改变不会像在UINavigationController中那样发生,需要微调。

要使用最less量的代码来实现这一点,请使用Object并将其子类化为TabBarControllerDelegate 。 您可以在Interface Builder中完成大部分的工作 。

 class TabBarControllerDelegate: NSObject, UITabBarControllerDelegate { func tabBarController(_ tabBarController: UITabBarController, didSelect viewController: UIViewController) { let orientedViewController = UIViewController() tabBarController.present(orientedViewController, animated: false) { () -> Void in tabBarController.dismiss(animated: false, completion: { () -> Void in }) } } } 

故事板结构

使用Storyboard有助于可视化应用程序的结构以及所有类之间的关系。

故事板


►在GitHub上find这个解决scheme和Swift Recipes的更多细节。