iOS 6中的UITabBarController支撑定向与当前UINavigation控制器(iO

2019-06-18 05:54发布

我有一个iPhone应用程序我更新到被具有旋转问题的iOS 6。 我有一个UITabBarController有16个UINavigationCotrollers 。 大部分子视图可以在纵向或横向的工作,但他们中的一些仅画像。 随着iOS 6的事情时,他们不应该转动。

我试着子类的tabBarController返回supportedInterfaceOrienations当前navigationController的选择的viewController的:

- (NSUInteger)supportedInterfaceOrientations{

    UINavigationController *navController = (UINavigationController *)self.selectedViewController;
    return [navController.visibleViewController supportedInterfaceOrientations];
}

这让我更接近。 视图控制器不转出的位置时可见的,但如果我在景观和切换标签,新标签将横向即使不支持它。

理想情况下,应用程序将只能在当前可见视图控制器的支持orienation。 有任何想法吗?

Answer 1:

继承您UITabBarController重写这些方法:

-(BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation
{
    // You do not need this method if you are not supporting earlier iOS Versions
    return [self.selectedViewController shouldAutorotateToInterfaceOrientation:interfaceOrientation];
}

-(NSUInteger)supportedInterfaceOrientations
{
    return [self.selectedViewController supportedInterfaceOrientations];
}

-(BOOL)shouldAutorotate
{
    return YES;
}

继承您UINavigationController重写这些方法:

-(NSUInteger)supportedInterfaceOrientations
{
    return [self.topViewController supportedInterfaceOrientations];
}

-(BOOL)shouldAutorotate
{
    return YES;
}

然后实现这些方法在你viewControllers,你不想旋转:

- (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation
{
    return (interfaceOrientation == UIInterfaceOrientationPortrait);
}

-(BOOL)shouldAutorotate
{
    return NO;
}

-(NSUInteger)supportedInterfaceOrientations
{
    return UIInterfaceOrientationMaskPortrait;
}

并为你想旋转viewControllers:

    - (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation
    {
        return (interfaceOrientation != UIInterfaceOrientationPortraitUpsideDown);
    }

    -(NSUInteger)supportedInterfaceOrientations
    {
        return UIInterfaceOrientationMaskAllButUpsideDown;
    }

    -(BOOL)shouldAutorotate
    {
        return YES;
    }

你tabbarController应该作为应用程序窗口的RootViewController的。 如果您计划支持默认的方向,但一切是颠倒默认的iPhone,那么你不需要做任何事情。 如果你想支持上下颠倒,或者如果你不想再支持的方向,那么你需要设置的应用程序委托和/或info.plist中相应的值。



Answer 2:

我有问题,在导航堆栈支持一些视图控制器的所有方向,有的只是画像,但UINavigationController是返回所有的应用程序支持的方向,这个小黑客帮我。 我不知道如果这是预期的行为或者是什么

@implementation UINavigationController (iOS6OrientationFix)

-(NSUInteger) supportedInterfaceOrientations {
    return [self.topViewController supportedInterfaceOrientations];
}

@end


Answer 3:

我认为是更好的类似的东西(如一个类中的方法)

-(NSUInteger) supportedInterfaceOrientations {
    if([self.topViewController respondsToSelector:@selector(supportedInterfaceOrientations)])
    {
        return [self.topViewController supportedInterfaceOrientations];
    }
    return UIInterfaceOrientationMaskPortrait;
}

这确保了该方法的实施。 如果你没有做这样的检查,该方法不(在iOS5中ENV等)来实现应用程序应该崩溃!



Answer 4:

如果您打算启用或全部观点不能旋转控制器,你并不需要继承UINavigationController 。 而是使用:

   -(NSUInteger)application:(UIApplication *)application supportedInterfaceOrientationsForWindow:(UIWindow *)window 

在你AppDelegate

如果您计划支持父视图控制器应用中的所有方向,但不同的方向( UINavigationController栈为例),你应该使用

   -(NSUInteger)application:(UIApplication *)application supportedInterfaceOrientationsForWindow:(UIWindow *)window 

AppDelegate与您的父视图控制器下面的方法相结合。

    - (BOOL)shouldAutorotate

- (NSUInteger)supportedInterfaceOrientations

但是,如果你打算在同一个导航堆栈(像我)在不同的孩子ViewControllers不同的方向设置你需要检查当前的ViewController导航堆栈。

我创建了以下在我UINavigationController子类:

    - (BOOL)shouldAutorotate
{
    return YES;
}

- (NSUInteger)supportedInterfaceOrientations
{
    int interfaceOrientation = 0;

    if (self.viewControllers.count > 0)
    {
        DLog(@"%@", self.viewControllers);
        for (id viewController in self.viewControllers)
        {
            if ([viewController isKindOfClass:([InitialUseViewController class])])
            {
                 interfaceOrientation = UIInterfaceOrientationMaskPortrait | UIInterfaceOrientationMaskPortraitUpsideDown;
            }
            else if ([viewController isKindOfClass:([MainViewController class])])
            {
                 interfaceOrientation = UIInterfaceOrientationMaskPortrait | UIInterfaceOrientationMaskPortraitUpsideDown;
            }
            else
            {
                 interfaceOrientation = UIInterfaceOrientationMaskAllButUpsideDown;
            }
        }
    }
    return interfaceOrientation;
}

既然你不能从孩子ViewControllers了控制呈现视图控制器的旋转设置,你必须以某种方式拦截什么视图控制器是目前在导航堆栈。 所以这是我做了什么:)。 希望帮助!



文章来源: iOS 6 UITabBarController supported orientation with current UINavigation controller