在 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