0

MPMoviePlayerControllerを拡張しているカスタムクラスがあるので、電話の向きに合わせて回転できます。私のアプリは、ビデオの再生中の他のビューでの回転をサポートしていません。これはうまく機能します...しばらくの間。アプリが削除されて再インストールされるまで、ランダムにポートレート方向でのみ再生されます。他の誰かがこのようなものを見たことがありますか?しばらくこれを追いかけていて、直ると思う度に戻ってきます。

ありがとう。

4

1 に答える 1

0

私はまったく同じことをしました。私のアプリケーションはタブ ベースで、ムービー プレーヤー以外の回転をサポートしていません。これが私のコードです。一貫して回転するムービーの再生中に使用しています。この解決策を思い付くために、ムービー プレーヤー ビューが回転せず、MPMoviePlayer がボタン発行リンクを実行ことを使用しました。幸運を!

使用法:

CustomMoviePlayer* cPlayer = [[CustomMoviePlayer alloc] init];
[cPlayer playMovie:movieFilePath onViewController:self];

CustomMoviePlayer.h

#import <MediaPlayer/MediaPlayer.h>

@interface CustomMoviePlayer : UIViewController 

@property(nonatomic, retain)  MPMoviePlayerController* moviePlayer;
-(void)playMovie:(NSString*)filePath onViewController:(UIViewController*)view;

@end

CustomMoviePlayer.m

#import "CustomMoviePlayer.h"
#define degreesToRadian(x) (M_PI * (x) / 180.0)
#define radianToDegrees(x) ((x) * 180.0/M_PI)

@implementation CustomMoviePlayer

-(void)playMovie:(NSString*)filePath onViewController:(UIViewController*)controller {
    [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(rotateMoviePlayer) name: UIDeviceOrientationDidChangeNotification object:nil];
    [[UIDevice currentDevice] beginGeneratingDeviceOrientationNotifications];   

    NSURL *url = [NSURL fileURLWithPath:filePath];

    self.moviePlayer =  [[MPMoviePlayerController alloc] initWithContentURL:url];
    self.moviePlayer.controlStyle = MPMovieControlStyleDefault;
    self.moviePlayer.shouldAutoplay = YES;

    [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(moviePlaybackComplete:) name:MPMoviePlayerPlaybackDidFinishNotification object:moviePlayer];
    [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(MPMoviePlayerDidExitFullscreen:) name:MPMoviePlayerDidExitFullscreenNotification object:moviePlayer];

    [controller.view addSubview:moviePlayer.view];
    [self.moviePlayer setFullscreen:YES animated:YES];
}

- (void)moviePlaybackComplete:(NSNotification *)notification {
     [self cleanupOnMovieComplete];
}

- (void)MPMoviePlayerDidExitFullscreen:(NSNotification *)notification {
     [self cleanupOnMovieComplete];
}

- (void)cleanupOnMovieComplete {
    [[NSNotificationCenter defaultCenter] removeObserver:self name:MPMoviePlayerPlaybackDidFinishNotification object:moviePlayer];
    [[NSNotificationCenter defaultCenter] removeObserver:self name:MPMoviePlayerDidExitFullscreenNotification object:moviePlayer];

    if(_moviePlayer != nil) {
        [_moviePlayer.view removeFromSuperview];
        [_moviePlayer release];
        _moviePlayer = nil;
    }

    /* Transform window to identity */
    [[UIDevice currentDevice] endGeneratingDeviceOrientationNotifications]; 
    [[NSNotificationCenter defaultCenter] removeObserver:self name:UIDeviceOrientationDidChangeNotification object:nil];

    UIWindow *window = [UIApplication sharedApplication].keyWindow;

    if (!window)
        window = [[UIApplication sharedApplication].windows objectAtIndex:0];

    [window setTransform:CGAffineTransformIdentity];
}

-(void)rotateMoviePlayer {
    UIDeviceOrientation orientation = [[UIDevice currentDevice] orientation];

     if (orientation != UIDeviceOrientationUnknown) {

         CGAffineTransform transform = CGAffineTransformMakeRotation(degreesToRadian(0));

         UIWindow *window = [UIApplication sharedApplication].keyWindow;

        if (!window)
            window = [[UIApplication sharedApplication].windows objectAtIndex:0];

        switch (orientation) {
            case UIDeviceOrientationLandscapeLeft:
                transform = CGAffineTransformMakeRotation(M_PI / 2); 
                [window setTransform:transform];
                break;
            case UIDeviceOrientationLandscapeRight:
                transform = CGAffineTransformMakeRotation(-M_PI / 2);
                [window setTransform:transform];
                break;
            case UIDeviceOrientationPortraitUpsideDown:
                transform = CGAffineTransformMakeRotation(M_PI);
                [window setTransform:transform];
                break;  
            case UIDeviceOrientationPortrait:
                [window setTransform:CGAffineTransformIdentity];
                break;
         }
    }   
}

@end
于 2012-09-20T14:14:32.097 に答える