在 iOS 5 和 6 上仅支持在一个选项卡中旋转

Posted

技术标签:

【中文标题】在 iOS 5 和 6 上仅支持在一个选项卡中旋转【英文标题】:Support rotation in only one tab on both iOS 5 and 6 【发布时间】:2013-03-27 08:19:07 【问题描述】:

我的应用是一个有两个标签的记分员。标签一是实际进行记分的地方,标签二包含过去比赛的历史。只有第一个选项卡支持旋转,并且在旋转时会隐藏其导航栏和选项卡栏(没有足够的垂直空间)。我根本不想在历史选项卡上支持旋转,因为选项卡栏隐藏在计数器中。切换标签然后让标签栏消失是很不和谐的。

第一个标签栏中可能会显示几种类型的游戏,它们都是“CounterBase”的所有子类。当一个新游戏开始时,标签栏中的第一个视图控制器被换出。所有旋转代码都在 CounterBase 中处理,而不是在其子类中。

我尝试了很多方法来支持轮换,但它们都很不稳定。到目前为止,我得到的最好结果是在第一次加载应用程序时一切正常,但在第一次启动新游戏时停止旋转(交换第一个视图控制器)。

我发现的一件事是,在第一个视图控制器被换出后,应用委托中的 supportedInterfaceOrientationsForWindow 不再被调用。

处理这个问题的最佳方法是什么?

更新我忘了我在 iPad 上使用标签栏,因为它总是隐藏的。旋转在那里工作得很好,所以现在我很困惑。但是,历史选项卡永远不会显示,这可能是相关的,也可能是不相关的。

更新 2 我也尝试过使用自定义导航控制器并实现 shouldAutorotate。还是不行。

更新 3 我发现它并没有替换导致问题的第一个选项卡,而是在导航控制器中使用 presentViewController:animated:completion: 呈现模式视图。我尝试在呈现的视图控制器中覆盖 shouldAutorotate ,但它什么也没做。另外,我在下面的 UINavigationController 上添加了我正在使用的类别。

这是我当前的实现:

标签栏控制器类别

   -(BOOL)shouldAutorotate
        if (self.selectedIndex == 0) // First tab is Counter
            return YES;
        else
            return NO;
    

    - (NSUInteger)supportedInterfaceOrientations
        if (self.selectedIndex==0) 
            return UIInterfaceOrientationMaskAll;
        
        else 
            return UIInterfaceOrientationMaskAllButUpsideDown;
        
    

    - (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation 
        ALog(@"Tab bar selectedIndex: %d", self.selectedIndex);
        return self.selectedIndex == 0;
    

CounterBase

- (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation 
    if (UI_USER_INTERFACE_IDIOM_PAD())
        return YES;
     else if (interfaceOrientation != UIInterfaceOrientationPortraitUpsideDown)
        return YES;
    
    return NO;


- (NSUInteger)supportedInterfaceOrientations 
    if (UI_USER_INTERFACE_IDIOM_PHONE())
        return UIInterfaceOrientationMaskAllButUpsideDown;
    else
        return UIInterfaceOrientationMaskAll;


- (BOOL) shouldAutorotate 
    return YES;

历史库

-(BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)toInterfaceOrientation
    BilliardsBuddyAppDelegate *appDelegate = [[UIApplication sharedApplication] delegate];
    return appDelegate.tabBarController.selectedIndex == 0;


-(BOOL)shouldAutorotate
    return NO;


-(NSUInteger)supportedInterfaceOrientations 
    return UIInterfaceOrientationPortrait;

AppDelegate

- (NSUInteger) application:(UIApplication *)application supportedInterfaceOrientationsForWindow:(UIWindow *)window 
    ALog(@"Tab bar selectedIndex: %d", tabBarController.selectedIndex);
    if (tabBarController.selectedIndex == 0 || UI_USER_INTERFACE_IDIOM_PAD())
        return UIInterfaceOrientationMaskAll;
     else 
        return UIInterfaceOrientationMaskPortrait;
    



@implementation UINavigationController (autoRotate)
-(BOOL)shouldAutorotate 
    return YES;

- (NSUInteger)supportedInterfaceOrientations 
    return UIInterfaceOrientationMaskAll;

@end

【问题讨论】:

【参考方案1】:

好吧,三天后我终于解决了这个问题。我正在使用 Mugunth Kumar 的 UIKit categories 来展示一份行动表。显然 UIActionSheet 不喜欢有一个不是 UIViewController 的委托集。 (或者甚至可能是最顶层的视图控制器。我不确定。)切换回标准 UIActionSheet showFromTabBar 解决了这个问题。

【讨论】:

以上是关于在 iOS 5 和 6 上仅支持在一个选项卡中旋转的主要内容,如果未能解决你的问题,请参考以下文章

如何在 iOS 上仅将 javascript 函数定位到 Safari < 6.0

在 ios 6 上仅在一个视图中启用横向

如何在 Xcode 4.5 上安装 iOS 4.3 模拟器?

应用程序仅在 iOS 6 中旋转,在 iOS 5 中不旋转

使用 AngularJS 的引导指令在选项卡中添加图像

仅自动旋转 UITabBar 内的一些选项卡? (iOS 5)