UITabBarController,MoreNavigationController和设备轮换的圣杯

时间:2009-08-13 02:16:29

标签: iphone-sdk-3.0 uiviewcontroller uitabbarcontroller rotation orientation

3 个答案:

答案 0 :(得分:7)

Apple建议不要对UITabBarController进行子类化,因此我找到了一种使用类别来处理自动旋转的简单方法。它不会修复你的更多...视图控制器的错误,但我认为这是一种更加苹果友好的方式来完成工作(并意味着更少的子类化)。

为了使我的应用程序中的每个选项卡都能正确自动旋转,我在自定义视图控制器中定义了-shouldAutorotateToInterfaceOrientation:但是它们都在UITabBarController中的UINavigationControllers中,因此消息不会从链中发送到我的VC直到那两个也回应。所以我将以下行添加到我的app委托文件中:

  

添加到MyAppDelegate.h的底部

@interface UITabBarController (MyApp)
@end

@interface UINavigationController (MyApp)
@end
  

添加到MyAppDelegate.m的底部

@implementation UITabBarController (MyApp) 
- (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)toInterfaceOrientation {
    return YES;
}
@end

@implementation UINavigationController (MyApp) 
- (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)toInterfaceOrientation {
    return YES;
}
@end

答案 1 :(得分:3)

看来我们有一个错误。我创建了一个可重现的,最小的测试用例,并通过Apple Bug Reporter(RADAR Problem 7139857)报告。

更新:自iPhone OS 3.1起修复此问题。

基本问题是:

  

查看已经存在的控制器   导航控制器堆栈没有   接收   的 willAnimateRotationToInterfaceOrientation:持续时间:   标签栏控制器的消息   '更多导航控制器'在   使用

当标签栏项视图控制器是基本视图控制器时,此问题确实。仅在使用“更多”导航层次结构时它们是导航控制器且仅

控制台消息(关于两阶段旋转动画)表明框架内的某些东西(更多导航控制器?)仍在使用两阶段动画,即使现在推荐从iPhone OS 3.0开始单阶段。 / p>

这可以解释为什么在该特定情况下不会调用 willAnimateRotationToInterfaceOrientation:。根据Apple的视图控制器文档,当响应两阶段,第一/第二半方向消息时,不会调用此消息。

答案 2 :(得分:0)

Victorb's answer的略微修改版本,允许每个视图控制器决定是否允许旋转。

Here as a gist for easier copying & forking

AppDelegate.h

@interface UITabBarController (MyApp)
@end

@interface UINavigationController (MyApp)
@end

AppDelegate.m

@implementation UITabBarController (MyApp) 
- (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)toInterfaceOrientation {
    UIViewController *selectedVC = [self selectedViewController];
    if ([selectedVC respondsToSelector:@selector(shouldAutorotateToInterfaceOrientation:)]) {
        return [selectedVC shouldAutorotateToInterfaceOrientation:toInterfaceOrientation];
    }

    //optimistic return - if you want no rotation, you have to specifically tell me!
    return YES;
}
@end

@implementation UINavigationController (MyApp) 
- (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)toInterfaceOrientation {
    UIViewController *visibleVC = [self visibleViewController];
    if ([visibleVC respondsToSelector:@selector(shouldAutorotateToInterfaceOrientation:)]) {
        return [visibleVC shouldAutorotateToInterfaceOrientation:toInterfaceOrientation];
    }

    //optimistic return - if you want no rotation, you have to specifically tell me!
    return YES;
}
@end