iphone - 强制MPMoviePlayerController以横向模式播放视频

时间:2011-01-19 21:04:30

标签: iphone objective-c video mpmovieplayercontroller

我的应用程序仅为纵向模式,但是当用户播放视频时,我希望它以全屏横向模式播放(视频播放器在纵向模式下看起来不太好)。我是这样玩的:

[self.view addSubview:myMoviePlayer.view];
[self.myMoviePlayer setFullscreen:YES animated:YES];
[self.myMoviePlayer play];

实现这一目标的最佳方法是什么?

5 个答案:

答案 0 :(得分:7)

阅读这篇文章:

http://iosdevelopertips.com/video/getting-mpmovieplayercontroller-to-cooperate-with-ios4-3-2-ipad-and-earlier-versions-of-iphone-sdk.html

主要思想是:

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

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

答案 1 :(得分:1)

我的应用非常简单,UINavigationController作为根视图控制器,显示主导航屏幕和一些细节屏幕。由于布局限制,主屏幕不支持旋转,并且为了保持一致性,细节屏幕(简单地将其推入导航控制器的堆栈)也不支持。但是,某些详细信息屏幕包含视频链接,视频需要以纵向模式显示。该应用程序使用MPMoviePlayerController以模态方式显示播放器。

我刚才有类似的问题,并尝试了上面的解决方案,它将仿射变换应用于MPMoviePlayerController的视图,但问题是状态栏继续显示为纵向模式,并重叠模态电影播放器​​视图(打开左边,如果根据上面的旋转查看)。我尝试了几件事无济于事:

  • 隐藏状态栏。这不起作用,因为玩家存在于自己的世界中,并继续前进并呈现状态栏。我找不到办法让它消失。

  • 明确设置状态栏方向。我不确定为什么这不起作用,但我怀疑是因为我在我的info.plist中指出只支持肖像,因此不再进行更改。

净网,以上对我不起作用。同样,b / c Apple告诫开发人员将MPMoviePlayerController视为不透明,并且(特别是使用转换方法)我违反了这一点。

最后,我找到了一个对我有用的简单解决方案:

  1. 在info.plist中,我表示支持所有方向(倒置除外,因此标准的iPhone成语)。

  2. 子类UINavigationController,并覆盖相应的shouldAutorotate方法,以便仅支持Portrait(有关如何在iOS< 6和iOS6中同时执行此操作,请参阅this solution等。)

  3. 这很有效,因为:

    1. 虽然我已经指出应用程序支持自动旋转,但我在UINavigationController子类中切断了它,其中包含我正在渲染的所有视图...所以一切都是肖像,除外:

    2. MPMoviePlayerController以模态方式呈现在NavigationController的顶部,并且存在于自己的世界中。因此,可以自由地关注info.plist中的内容,并自行轮换。

    3. 有很多关于如何以模态方式呈现播放器的示例,但为了快速参考,这是我的代码:

      - (void)presentModalMediaPlayerForURL:(NSURL *)inURL
      {
          NSLog(@"Will play URL [%@]", [inURL description]);
          MPMoviePlayerViewController *player = [[MPMoviePlayerViewController alloc] initWithContentURL:inURL];
          [player.view setBounds:self.view.bounds];
      
          [player.moviePlayer prepareToPlay];
          [player.moviePlayer setFullscreen:YES animated:YES];
          [player.moviePlayer setShouldAutoplay:YES];
          [player.moviePlayer setMovieSourceType:MPMovieSourceTypeFile];
          [self presentModalViewController:player animated:YES];
      
          [player release];
      }
      

答案 2 :(得分:0)

对于全屏播放,使用MPMoviePlayerViewController,然后以横向格式启动和播放,使用MPMoviePlayerViewController类上的“shouldAutorotateToInterfaceOrientation”方法。

看起来像这样:

[yourInstanceOfMPMoviePlayerViewController shouldAutorotateToInterfaceOrientation: UIInterfaceOrientationLandscapeRight];

答案 3 :(得分:0)

我遇到了同样的情况,但我使用的是iOS 6和基于NavController的项目。令人感兴趣的是ViewController托管MPMoviePlayerController我不想旋转,但我想让它内的视频旋转。

ViewController with rotated MPMoviePlayerController
我只需根据设备方向手动旋转MPMoviePlayerController。 _videoView是ViewController的MPMoviePlayerController属性。例如,我只是将所需的宽度和高度硬编码为16x9宽高比,因为我打算将此视频上传到youtube。

- (void)updateVideoRotationForCurrentRotationWithAnimation:(bool)animation
{
    CGSize containerSize  = _videoView.frame.size;   // Container NOT rotated!
    float  videoWidth     = 384;                     // Keep 16x9 aspect ratio
    float  videoHeight    = 216;

    if( animation )
    {
        [UIView beginAnimations:@"swing" context:nil];
        [UIView setAnimationDuration:0.25];
    }

    switch( self.interfaceOrientation )
    {
        case UIInterfaceOrientationPortrait:
        case UIInterfaceOrientationPortraitUpsideDown:
            m_videoPlayer.view.transform = CGAffineTransformMakeRotation(radians(90));

            // This video player is rotated so flip width and height, but the container view
            // isn't rotated!
            [m_videoPlayer.view setFrame:CGRectMake((containerSize.width-videoHeight)/2,
                                                    (containerSize.height-videoWidth)/2,
                                                    videoHeight,
                                                    videoWidth)];
            break;

        case UIInterfaceOrientationLandscapeLeft:
        case UIInterfaceOrientationLandscapeRight:
            m_videoPlayer.view.transform = CGAffineTransformMakeRotation(radians(0));

            // This video player isn't rotated
            [m_videoPlayer.view setFrame:CGRectMake((containerSize.width-videoWidth)/2,
                                                    (containerSize.height-videoHeight)/2,
                                                    videoWidth,
                                                    videoHeight)];
            break;
    }

    if( animation )
        [UIView commitAnimations];

}


- (void)didRotateFromInterfaceOrientation:(UIInterfaceOrientation)fromInterfaceOrientation
{
    [self updateVideoRotationForCurrentRotationWithAnimation:YES];
}

在视图确实出现后我也调用了updateVideoRotationForCurrentRotationWithAnimation,因此它具有正确的初始方向。

答案 4 :(得分:0)

我使用以下代码来处理Movieplayer的唯一LANDSCAPE模式。

filteredArray = [];
for(x in arrayB)
{
filteredArray.concat( sourceArray.filter(function(e1){ return e1.type == arrayB[x])} );
}