TabBarController 旋转问题
Posted
技术标签:
【中文标题】TabBarController 旋转问题【英文标题】:TabBarController rotation problems 【发布时间】:2015-08-27 16:44:59 【问题描述】:整个星期我一直在寻找解决我独特问题的方法,但还没有对我有用。我有一个有 6 个选项卡的 TabBarController。 ios 会自动创建“更多”选项卡,其中包含视图控制器、“仪表板”,这是我遇到的困难。 “仪表板”视图控制器充当具有 3 个页面的页面控制器。
当我按下“仪表板”项时,我希望屏幕方向从纵向更改为横向。我通过无数其他 SO 帖子了解到,旋转是由父 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
【问题讨论】:
你找到解决办法了吗? 根据我自己的研究和对所读内容的理解,TabBarControllers 无法旋转。所以我所做的是为“仪表板”设置一个纵向视图控制器,用于监听方向的变化。当方向变为横向时,我会模态地展示我的页面视图控制器 我想你可以尝试让 TabBarViewController 在选择“仪表板”时以模态方式呈现 pageViewController,而不是尝试旋转设备......TabBarViewController
,出于某种原因,需要一个触发器来旋转,但可以做到。 ***.com/a/32390717/218152 展示了如何在 TabBarViewController
上实现方向变化而不是模态。
【参考方案1】:
改变 UITabBarController 的方向
虽然有几十个也许和试试这个这个问题,但主要问题在于每个UINavigationController
的精心设计,对@987654327的正确回应UITabBarController
中的@,以及一些强制所需方向的代码。
这很可能只是一个 iOS 错误,因为一旦旋转,UINavBarController
和所有嵌入的 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
那样发生,需要轻推。
要以最少的代码量做到这一点,请使用 Object 并将其子类化为 TabBarControllerDelegate
。您可以在 Interface Builder 中执行 most of the work。
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 上查找此解决方案,在Swift Recipes 上查找更多详细信息。
【讨论】:
以上是关于TabBarController 旋转问题的主要内容,如果未能解决你的问题,请参考以下文章
如何从 TabBarController 上 NavigationController 的 TableViewController 子项锁定旋转