我的应用程序仅为纵向模式,但是当用户播放视频时,我希望它以全屏横向模式播放(视频播放器在纵向模式下看起来不太好)。我是这样玩的:
[self.view addSubview:myMoviePlayer.view];
[self.myMoviePlayer setFullscreen:YES animated:YES];
[self.myMoviePlayer play];
实现这一目标的最佳方法是什么?
答案 0 :(得分:7)
阅读这篇文章:
主要思想是:
[[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中指出只支持肖像,因此不再进行更改。
最后,我找到了一个对我有用的简单解决方案:
在info.plist中,我表示支持所有方向(倒置除外,因此标准的iPhone成语)。
子类UINavigationController,并覆盖相应的shouldAutorotate方法,以便仅支持Portrait(有关如何在iOS< 6和iOS6中同时执行此操作,请参阅this solution等。)
这很有效,因为:
虽然我已经指出应用程序支持自动旋转,但我在UINavigationController子类中切断了它,其中包含我正在渲染的所有视图...所以一切都是肖像,除外:
MPMoviePlayerController以模态方式呈现在NavigationController的顶部,并且存在于自己的世界中。因此,可以自由地关注info.plist中的内容,并自行轮换。
有很多关于如何以模态方式呈现播放器的示例,但为了快速参考,这是我的代码:
- (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我不想旋转,但我想让它内的视频旋转。
我只需根据设备方向手动旋转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])} );
}