自动旋转,UIWebView和UITabBarController

时间:2011-03-15 09:57:18

标签: iphone video uiwebview uitabbarcontroller autorotate

我有以下视图层次结构:

UITabBarController
 |
 UINavigationController
 |         |
 |         UIViewController (only supports Portrait rotation)
 |
 UINavigationController
 |         |
 |         UIViewController (only supports Portrait rotation)
 |
 UINavigationController
 |         |
 |         UIViewController (only supports Portrait rotation)
 |         |
 |         UIViewController (has UIWebView with movie in it)
 |
 UINavigationController
           |
           UIViewController (only supports Portrait rotation)

现在的问题是,当我显示带有电影的UIWebView并且用户按下“播放”时,全屏媒体播放器将按预期打开。但是,我无法旋转电影,​​因为父UIViewController仅支持纵向方向(我对此进行了测试)。当我为父视图控制器启用横向时,它可以正常工作,但在这种情况下,我仍然遇到横向模式时用户切换标签的问题(另请参阅我昨天发布的这个问题:Autorotate ignored when changing tabs

有没有人对如何解决这个问题有任何想法?一方面,我希望让用户能够旋转视频,另一方面重写所有其他viewControllers以支持格局,看起来似乎也有太大的优势。

2 个答案:

答案 0 :(得分:0)

考虑一种不同的方法:而不是将UIWebView与其中的电影一起展示为整个标签控制器层次结构中的UIViewController,它将您与整个旋转问题联系起来,尝试将顶层视图控制器(UITabBarController)替换为完全不同的UIViewController(包含UIWebView)。

如果要退出全屏影片模式,请再次将UITabBarController恢复为顶级视图控制器。注:做忘记在执行切换时删除“旧”视图控制器 - 当UIWindow有多个子视图,并且没有发送自动旋转消息等时,UIWindow会非常不满意。

我看到应用程序在面对这样的自转障碍时会使用这样的策略。

这种策略可能看起来有点“脱胶”,你可能不得不在转换的更精细方面做一些调整,但值得一看。

答案 1 :(得分:0)

您可以在viewcontrollers中发送通知,告诉其他视图控制器需要旋转,以便它们向所有方向返回YES。当您离开视图控制器时,您会发送另一个不再需要的通知。使用这种方法,您可以只在您想要的视图中进行自动旋转,并在离开这些视图后立即停用它。

在我的应用程序中,我在Web视图中使用此方法,其中需要自动旋转但不在其他视图控制器中。

  • (无效)viewWillAppear中:(BOOL)动画{

    [super viewWillAppear:animated];

    NSNotification * autoRotationNotification = [NSNotification notificationWithName:kShouldAutoRotateNotification object:[NSNumber numberWithBool:YES]]; [[NSNotificationCenter defaultCenter] postNotification:autoRotationNotification];

}

  • (无效)viewWillDisappear:(BOOL)动画{ [super viewWillDisappear:animated];

    NSNotification * autoRotationNotification = [NSNotification notificationWithName:kShouldAutoRotateNotification object:[NSNumber numberWithBool:NO]]; [[NSNotificationCenter defaultCenter] postNotification:autoRotationNotification]; }