我的应用是一个有两个标签的记分员。标签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
答案 0 :(得分:0)
好吧,三天后我终于解决了这个问题。我正在使用Mugunth Kumar的伟大UIKit categories来展示一张活动表。显然UIActionSheet不喜欢拥有不是UIViewController的委托集。 (或者甚至是最顶层的视图控制器。我不确定。)切换回标准UIActionSheet showFromTabBar修复了这个问题。