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模式下观看时,我是否可以缩放视频?