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

时间:2013-03-27 08:19:07

标签: ios5 ios6 rotation uitabbar autorotate

我的应用是一个有两个标签的记分员。标签1是实际进行记分的地方,标签2包含过去游戏的历史记录。只有标签1支持旋转,旋转时它隐藏其导航和标签栏(没有足够的垂直空间)。我不想在历史记录选项卡上支持旋转,因为标签栏隐藏在计数器中。切换标签然后让标签栏消失是非常不和谐的。

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

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

我发现的一件事是,在第一个视图控制器被换出后,app delegate中的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;
}

HistoryBase

-(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 个答案:

答案 0 :(得分:0)

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