如何在 iOS 6 GM 中的标签栏应用程序中使旋转正常工作?

Posted

技术标签:

【中文标题】如何在 iOS 6 GM 中的标签栏应用程序中使旋转正常工作?【英文标题】:How do I make rotation work properly in iOS 6 GM in a tab bar app? 【发布时间】:2012-09-14 03:49:54 【问题描述】:

旋转在 ios 5 上运行良好,但现在根本无法运行。我进行了设置,以便当某个视图打开时,在 Tab 1 上时,我的所有视图都保持纵向异常,然后用户可以旋转,它会显示一个 Coverflow 样式的视图。

我的设置是在运行时在 AppDelegate 中创建我的标签栏。然后我将其设置为主根视图:

self.window.rootViewController = self.tabBarController;

但我的所有视图,在所有选项卡上,现在无论如何都向左或向右旋转。而且我尝试添加新代码(来自论坛中的多个示例)但无济于事......我对所有内容都设置了断点,并且在我旋转手机时不会调用任何旋转代码。

每个 TabController 中都有一个 NavigationController,然后在其中包含我的所有 UI 的主视图。

关于如何在 iOS 6 中正确进行旋转的任何想法或指示?非常令人沮丧,因为这是我在发货前需要解决的最后一个问题。

【问题讨论】:

【参考方案1】:

这将使您启动并运行。最终你真的应该继承这些 UIKit 类而不是使用类别,但不幸的是,这不适用于尚未为 iOS 6 修复的第三方库。这些类别应该适用于所有事情,而不需要你在其他人的代码中搞砸。

我还没有看到任何不涉及子类化(或编写类别)的UITabBarControllerUINavigationController 问题的解决方案。不过,我希望存在一个。

确保在 Prefix.pch 文件的顶部导入三个 .h 文件(如果您选择将它们全部添加到单个文件中,则导入一个) .您必须确保尽快加载此代码!

UITabBarController+LegacyRotation.h

#import <UIKit/UIKit.h>

@interface UITabBarController (LegacyRotation)

@end

UITabBarController+LegacyRotation.m

#import "UITabBarController+LegacyRotation.h"

@implementation UITabBarController (LegacyRotation)

- (NSUInteger)supportedInterfaceOrientations

    return [self.selectedViewController supportedInterfaceOrientations];


- (BOOL)shouldAutorotate

    return [self.selectedViewController shouldAutorotate];


@end

UINavigationController+LegacyRotation.h

#import <UIKit/UIKit.h>

@interface UINavigationController (LegacyRotation)

@end

UINavigationController+LegacyRotation.m

#import "UINavigationController+LegacyRotation.h"

@implementation UINavigationController (LegacyRotation)

- (NSUInteger)supportedInterfaceOrientations

    return [self.topViewController supportedInterfaceOrientations];


- (BOOL)shouldAutorotate

    return [self.topViewController shouldAutorotate];


@end

UIViewController+LegacyRotation.h

#import <UIKit/UIKit.h>

@interface UIViewController (LegacyRotation)

@end

UIViewController+LegacyRotation.m

#import "UIViewController+LegacyRotation.h"

@implementation UIViewController (LegacyRotation)

- (NSUInteger)supportedInterfaceOrientations

    NSUInteger ret = 0;

    if ([self shouldAutorotateToInterfaceOrientation:UIInterfaceOrientationPortrait]) 
        ret |= UIInterfaceOrientationMaskPortrait;
    
    if ([self shouldAutorotateToInterfaceOrientation:UIInterfaceOrientationPortraitUpsideDown]) 
        ret |= UIInterfaceOrientationMaskPortraitUpsideDown;
    
    if ([self shouldAutorotateToInterfaceOrientation:UIInterfaceOrientationLandscapeLeft]) 
        ret |= UIInterfaceOrientationMaskLandscapeLeft;
    
    if ([self shouldAutorotateToInterfaceOrientation:UIInterfaceOrientationLandscapeRight]) 
        ret |= UIInterfaceOrientationMaskLandscapeRight;
    

    return ret;


- (BOOL)shouldAutorotate

    return YES;


@end

【讨论】:

【参考方案2】:

我只需要在 appDelegate 中添加以下方法,以便旋转到

在 iOS 6 上工作。

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

(UIWindow *)窗口

           return UIInterfaceOrientationMaskAll;

至于 ios 4 & 5 还是要使用的地方:

(BOOL)shouldAutorotateToInterfaceOrientation:

               (UIInterfaceOrientation)interfaceOrientation in the specific view controller

【讨论】:

以上是关于如何在 iOS 6 GM 中的标签栏应用程序中使旋转正常工作?的主要内容,如果未能解决你的问题,请参考以下文章

iOS 6 + 7 中的 iOS 隐藏状态栏和标签栏

如何在 iOS 10 中使导航栏透明

如何在 iOS 7 中使导航栏透明? [复制]

如何在ios中同时实现标签栏和侧边菜单?

如何在xamarin表单ios中隐藏标签栏导航标题

如何在 iOS 11 中支持大标签栏预览?