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的更多细节。