Ios5 iOS:电影播放器视图不';t旋转
我想显式旋转我的电影播放器视图(不使用自动旋转代理)。我为此编写了以下代码,并在其中添加了注释。电影播放器的父视图会旋转,但不会旋转电影播放器视图本身。有人能帮我一下我做错了什么吗?谢谢Ios5 iOS:电影播放器视图不';t旋转,ios5,uiview,mpmovieplayercontroller,transformation,Ios5,Uiview,Mpmovieplayercontroller,Transformation,我想显式旋转我的电影播放器视图(不使用自动旋转代理)。我为此编写了以下代码,并在其中添加了注释。电影播放器的父视图会旋转,但不会旋转电影播放器视图本身。有人能帮我一下我做错了什么吗?谢谢 #import "CustomMoviePlayer.h" #define degreesToRadian(x) (M_PI * (x) / 180.0) #define radianToDegrees(x) ((x) * 180.0/M_PI) @implementation CustomMoviePlay
#import "CustomMoviePlayer.h"
#define degreesToRadian(x) (M_PI * (x) / 180.0)
#define radianToDegrees(x) ((x) * 180.0/M_PI)
@implementation CustomMoviePlayer
@synthesize moviePlayer, myParentViewController;
-(void)playMovie:(NSString*)filePath onViewController:(UIViewController*)controller
{
[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(rotateMoviePlayer) name: UIDeviceOrientationDidChangeNotification object:nil];
[[UIDevice currentDevice] beginGeneratingDeviceOrientationNotifications];
myParentViewController = controller;
NSURL *url = [NSURL fileURLWithPath:filePath];
moviePlayer = [[MPMoviePlayerController alloc] initWithContentURL:url];
moviePlayer.controlStyle = MPMovieControlStyleDefault;
moviePlayer.shouldAutoplay = YES;
[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(moviePlaybackComplete:) name:MPMoviePlayerPlaybackDidFinishNotification object:moviePlayer];
[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(moviePlaybackStateChanged:) name:MPMoviePlayerPlaybackStateDidChangeNotification object:moviePlayer];
[controller.view addSubview:moviePlayer.view];
[moviePlayer setFullscreen:YES animated:YES];
}
- (void)moviePlaybackStateChanged:(NSNotification *)notification
{
NSLog(@"State changed... %d", [moviePlayer playbackState]);
}
- (void)moviePlaybackComplete:(NSNotification *)notification
{
NSLog(@"Finished video...");
[[NSNotificationCenter defaultCenter] removeObserver:self name:MPMoviePlayerPlaybackDidFinishNotification object:moviePlayer];
[[NSNotificationCenter defaultCenter] removeObserver:self name:MPMoviePlayerPlaybackStateDidChangeNotification object:moviePlayer];
[[NSNotificationCenter defaultCenter] removeObserver:self name:UIDeviceOrientationDidChangeNotification object:nil];
[myParentViewController.view setTransform:CGAffineTransformIdentity];
[moviePlayer.view removeFromSuperview];
[moviePlayer release];
}
-(void)rotateMoviePlayer
{
NSLog(@"Rotate movie player");
UIDeviceOrientation orientation = [[UIDevice currentDevice] orientation];
if (orientation != UIDeviceOrientationUnknown) {
CGAffineTransform transform = CGAffineTransformMakeRotation(degreesToRadian(0));
switch (orientation) {
case UIDeviceOrientationLandscapeLeft:
transform = CGAffineTransformMakeRotation(M_PI / 2);
break;
case UIDeviceOrientationLandscapeRight:
transform = CGAffineTransformMakeRotation(-M_PI / 2);
break;
case UIDeviceOrientationPortraitUpsideDown:
transform = CGAffineTransformMakeRotation(M_PI);
break;
default:
break;
}
// This view does rotate and I can see it rotating when there is no moviePlayer on top of it!
[myParentViewController.view setTransform:CGAffineTransformIdentity];
[myParentViewController.view setTransform:transform];
// It doesn't mater whether I put following two lines or not...Movie player view doesn't rotate!
[moviePlayer.view setTransform:CGAffineTransformIdentity];
[moviePlayer.view setTransform:transform];
}
}
- (void)dealloc {
[moviePlayer release];
[super dealloc];
}
@end
您正在全屏模式下使用MPMoviePlayerController,因此应用于其视图(和/或其superview)的旋转无效 当使用全屏模式时,
MPMoviePlayerController
实际上使用了一种不同的方法,将其渲染层直接添加到UIWindow中-也就是说,它实际上没有使用其视图
属性
要在全屏播放电影时获取当前的ui窗口
,可以使用以下代码段:
UIWindow *window = [UIApplication sharedApplication].keyWindow;
if (!window)
{
window = [[UIApplication sharedApplication].windows objectAtIndex:0];
}
获得该窗口后,直接对其应用旋转
然而,这将导致许多难以克服的问题(相信我,我去过那里,收集了一批T恤)。作为另一种方式,我强烈建议您使用假全屏模式
而不是像你那样初始化播放器
[moviePlayer setFullscreen:YES animated:YES];
为什么不简单地将其视图的帧大小初始化为整个屏幕,或者像这样初始化其superview的边界
moviePlayer.view.frame = myParentViewController.view.bounds;
然后,要获得全屏界面,请使用以下控件样式:
moviePlayer.controlStyle = MPMovieControlStyleFullscreen;
这样,您的播放结果将与superview上的任何转换保持一致,您将不会产生任何副作用。这让我有一段时间被消耗掉了,我犯了很多可怕的错误,但最终我不是通过MPMoviePlayerController,而是通过mpmovieplayervontroller来完成的。在展示它之前,我只是旋转了属性self.playerView。此外,我还添加了NSNotification,它将在视频结束后返回主控件和主ViewController。下面是我如何执行它的:
[UIView beginAnimations:nil context:nil];
[UIView setAnimationBeginsFromCurrentState:YES];
[UIView setAnimationCurve:UIViewAnimationCurveEaseIn];
[UIView setAnimationRepeatCount:1];
player.view.transform = CGAffineTransformRotate(player.view.transform, M_PI_2);
[UIView commitAnimations];
[player.view setContentMode:UIViewContentModeScaleAspectFit];
[[NSNotificationCenter defaultCenter] removeObserver:self.playerView
name:MPMoviePlayerPlaybackDidFinishNotification
object:self.playerView.moviePlayer];
[[NSNotificationCenter defaultCenter] addObserver:self
selector:@selector(movieFinishedCallback:)
name:MPMoviePlayerPlaybackDidFinishNotification
object:self.playerView.moviePlayer];
self.playerView = [[MPMoviePlayerViewController alloc] initWithContentURL:docUrl];
self.playerView.view.frame = CGRectMake(10, 10, self.frame.size.width-20, 180);
[self.playerView.moviePlayer prepareToPlay];
if(IS_IPHONE_6P)
{
[self.playerView.view setBounds:CGRectMake(0, 0, 736, 414)];
[self.playerView.view setCenter:CGPointMake(212, 368)];
}
else if(IS_IPHONE_6)
{
[self.playerView.view setBounds:CGRectMake(0, 0, 375, 667)];
[self.playerView.view setCenter:CGPointMake(187, 333)];
}
else if (IS_IPHONE_5)
{
[self.playerView.view setBounds:CGRectMake(0, 0, 736, 414)];
[self.playerView.view setCenter:CGPointMake(160, 284)];
}
else
{
[self.playerView.view setBounds:CGRectMake(0, 0, 480, 320)];
[self.playerView.view setCenter:CGPointMake(160, 240)];
}
[self.playerView.view setTransform:CGAffineTransformMakeRotation(M_PI / 2)];
self.playerView.modalPresentationStyle = UIModalPresentationFormSheet;
self.playerView.modalTransitionStyle = UIModalTransitionStyleCoverVertical;
[self presentViewController:self.playerView animated:YES completion:nil];
回调movieFinishedCallback:如下所示
- (void)movieFinishedCallback:(NSNotification*)aNotification
{
// Obtain the reason why the movie playback finished
NSNumber *finishReason = [[aNotification userInfo] objectForKey:MPMoviePlayerPlaybackDidFinishReasonUserInfoKey];
// Dismiss the view controller ONLY when the reason is not "playback ended"
if ([finishReason intValue] != MPMovieFinishReasonPlaybackEnded)
{
MPMoviePlayerController *moviePlayer = [aNotification object];
[[NSNotificationCenter defaultCenter] removeObserver:self
name:MPMoviePlayerPlaybackDidFinishNotification
object:moviePlayer];
NSLog(@"Video Closed");
dispatch_after(dispatch_time(DISPATCH_TIME_NOW, 1 * NSEC_PER_SEC), dispatch_get_main_queue(), ^
{
[self dismissViewControllerAnimated:NO completion:nil];
self.playerView = nil;
});
}
}
这对我有用。希望能有所帮助。您的代码很难阅读,请根据常规做法花些时间重新格式化。还要确保(实例)变量不使用大写字母。谢谢@till。完成格式化!这是好东西。我没有意识到。非常感谢你。成功了!嗨,蒂尔,你知道电影播放器做了什么活动吗?我注意到它提供了与暂停相同的播放状态,但它不一样!我想处理“完成”按钮单击并停止监视方向更改事件。请尝试此解决方案来处理“完成”按钮点击:谢谢。这也很好!在转换窗口和原始电影播放器旋转之间我注意到的一件事是,当我使用窗口进行转换时,视频的缩放方式与原始电影播放器旋转中的缩放方式不同!我的意思是它在landscap模式下显示人像大小的视频。在landscap模式下观看时,我是否可以缩放视频?