如何旋转UIWebView嵌入视频

时间:2011-07-06 14:59:45

标签: iphone objective-c video uiwebview rotation

所以我对我正在构建的应用程序有这个问题,我无法弄明白。 我的申请具有以下结构:

  

UITabBarController - > UIViewController - >的UIViewController

最后一个视图控制器包含一个加载整个页面的UIWebView。在那个页面中有一部电影(mp4),用户一旦点击大圆形播放按钮就可以播放。

应用程序是以纵向模式运行的,并且由于它的初始设计,我无法以其他方式运行。

我想要实现的是让用户在电影开始播放后旋转手机并相应地旋转电影。我通过收听NSNotificationsCenter发送的不同NSNotifications来播放电影时设法'检测'。

我用它来检测开始:

[[NSNotificationCenter defaultCenter] addObserver:self
selector:@selector(movieIsPlaying:)
name:@"UIMoviePlayerControllerDidEnterFullscreenNotification"
object:nil];

这用于检测结束:

[[NSNotificationCenter defaultCenter] addObserver:self
selector:@selector(movieStopedPlaying:)
name:@"UIMoviePlayerControllerDidExitFullscreenNotification"
object:nil];

现在使用2个选择器我将一个全局变量设置为YES或NO,我稍后可以在

中使用
- (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)toInterfaceOrientation

如果我总是从上面的方法返回YES,我的应用程序界面会在everyscreen上旋转,除非电影启动并运行。最奇怪的是:

  • 我以肖像方式打开应用程序。
  • 转到所需的页面(参见上面的结构)
  • 将手机旋转至横向(界面旋转 - 这仅用于调试)
  • 我开始播放这部电影(它是在风景中发布的!Horray!)
  • 我将手机旋转回肖像(电影旋转!Horray再次!)
  • 我将手机旋转回横向(不再发生旋转......)

此外,如果我以纵向模式启动电影,它将永远不会旋转。

所以请各位让我知道你是否能以某种方式帮助我。我真的很绝望。如果您需要更多信息,请告诉我。

谢谢!

更新

最后,我提出了上述两种方法的解决方案:

- (void)movieIsPlaying:(NSNotification *)notification
{
    if (![Globals canRotateInterface]) {
        [Globals setCanRotateInterface:YES];

        [[UIApplication sharedApplication] setStatusBarOrientation:UIInterfaceOrientationLandscapeRight animated:NO];

        [[[[notification object] view] window] setBounds:CGRectMake(0, 0, 480, 320)];
        [[[[notification object] view] window] setCenter:CGPointMake(160, 240)];
        [[[[notification object] view] window] setTransform:CGAffineTransformMakeRotation(M_PI / 2)];
    }
}

- (void)movieStopedPlaying:(NSNotification *)notification
{   
    if ([Globals canRotateInterface]) {
        [Globals setCanRotateInterface:NO];

        [[UIApplication sharedApplication] setStatusBarOrientation:UIInterfaceOrientationPortrait animated:NO];

        [[[[notification object] view] window] setBounds:CGRectMake(0, 0, 320, 480)];
        [[[[notification object] view] window] setTransform:CGAffineTransformIdentity];

        // Little hack to force an orientation rotation so that all elements get their original size and place (eg. Navigation bar)
        UINavigationController *dummyNavigationViewController = [[UINavigationController alloc] init];
        [self presentModalViewController:dummyNavigationViewController animated:NO];
        [self dismissModalViewControllerAnimated:NO];
        [dummyNavigationViewController release];
    }
}

2 个答案:

答案 0 :(得分:0)

你应该尝试通过返回MoviePlayerController的fullScreen属性来实现shouldAutorotateToInterfaceOrientation,而不是捕获进入/退出全屏模式的通知:我怀疑轮换会导致这些通知有点混乱。

答案 1 :(得分:0)

我最后做的是使用提到的2个通知来检测用户何时播放或停止电影,并具有将窗口旋转到90度的代码。这样,用户只能以横向模式观看电影,但它比仅以肖像方式看电影更好。