答案 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