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 子项锁定旋转

P1452 Beauty Contes(旋转卡壳版)

旋转后 UITapGestureRecognizer 不会触发

UISplitView 方向问题

在 Firemonkey 组件中旋转时如何避免重复图像?

TabBarController 添加自定义按钮不可点击问题[重复]