TabBarController旋转问题

时间:2015-08-27 16:45:00

标签: ios objective-c iphone

整个星期我一直在寻找解决我的独特问题的方法,但是对我来说什么都没有用。我有一个TabBarController有6个选项卡。 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

1 个答案:

答案 0 :(得分:0)

更改UITabBarController的方向

虽然有很多可能尝试这个来解决这个问题,但主要问题在于每个UINavigationController的精心设计,对supportedInterfaceOrientations中的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有助于可视化应用程序的结构以及所有类之间的关系。

Storyboard

►在GitHub上找到此解决方案,并在Swift Recipes上找到其他详细信息。