2012-03-05 12 views
3

ムービープレーヤービューを明示的に回転させたい(オートローテーションデリゲートを使用しない)。私はそれのために次のコードを書いて、その中にコメントを入れました。ムービープレーヤの親ビューは回転しますが、ムービープレーヤビュー自体は回転しません。誰かがここで私が間違ってやっていることを助けてくれますか?ありがとう。iOS:ムービープレーヤービューが回転しない

#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 
+0

あなたのコードはほとんど読めるものではありません。一般的な方法に従って、コードを再フォーマットしてください。また、(インスタンス)変数に初期大文字を使用しないようにしてください。 – Till

+0

ありがとう@till。書式設定を完了しました! – applefreak

答えて

3

あなたはそれゆえ回転、フルスクリーンモードでMPMoviePlayerControllerを使用する/有効であるれていない、そのビュー(および/またはそのスーパー)に適用sです。

フルスクリーンモードを使用している場合、MPMoviePlayerControllerは実際にそのレンダリングレイヤーを直接UIWindowに追加することで別のアプローチを使用しています。つまり、効果的にviewプロパティを使用しません。

ムービーがフルスクリーンで再生されているときに現在のUIWindowを取得するには、次のスニペットを使用できます。

UIWindow *window = [UIApplication sharedApplication].keyWindow; 
if (!window) 
{ 
    window = [[UIApplication sharedApplication].windows objectAtIndex:0]; 
} 

このウィンドウを取得したら、それに直接回転を適用します。

しかしこれは、克服するのが難しい多くの可能性のある問題を引き起こします(私を信じて、そこには、Tシャツのコレクションを持っています)。別の方法として、偽フルスクリーンモードを使用することを強くお勧めします。以下のために、そして、またはこの

moviePlayer.view.frame = myParentViewController.view.bounds; 

のようなそのスーパービューの境界 -

代わりに、単に画面全体にそのビューのフレームサイズを初期化しないのはなぜあなたは

[moviePlayer setFullscreen:YES animated:YES]; 

を行ったようにプレイヤーを初期化します全画面インターフェイスを使用するには、次のコントロールスタイルを使用します。

moviePlayer.controlStyle = MPMovieControlStyleFullscreen; 

そうすれば、結果として得られる再生はスーパービューで行われた変換に従うので、副作用がなくなります。

+0

それは良いことです@時間。私はそれを知らなかった。どうもありがとうございました。出来た! – applefreak

+0

こんにちは、あなたがMoviePlayer Doneボタンがクリックされたイベントを知っていますか?私はそれが一時停止と同じ再生状態を与えることに気づいたが、それは同じではない! Doneボタンをクリックして、方向変更イベントの監視を停止したい – applefreak

+1

完了ボタンタップを処理するには、このソリューションをお試しください:http://stackoverflow.com/questions/6142571/mpmovieplayer-done-button-issue/6142685#6142685 – Till

1
[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]; 
0

これは、しばらくの間、私を消費し、私は非常に多くの異なる恐ろしいエラーを得たが、最終的に私はMPMoviePlayerControllerしかしMPMoviePlayerViewControllerを通してそれをやっていないてしまいました。私はちょうどそれを提示する前に、プロパティであるself.playerViewを回した。また、私はNSNotificationを追加しました。これはメインコントロールに戻り、ビデオの終了後にメインViewControllerに戻ります。ここで私はそれを実行して歩き回った方法は次のとおりです。

 [[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; 

     }); 
    } 
} 

、です。それが役に立てば幸い。

関連する問題