2012-03-05 6 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

감사합니다.서식 지정을 완료했습니다. – applefreak

답변

3

넌 따라서 회전 MPMoviePlayerController 전체 화면 모드를 사용하고/효과적되지는 뷰 (및/또는 수퍼) s의 적용.

화면 모드를 사용 MPMoviePlayerController 실제로 UIWindow에 직접 묘화 층을 추가하여 다양한 방법을 사용한다 - 즉, 그것이 효과적으로 view 속성을 사용하지 않는다.

동영상이 전체 화면에서 재생 될 때 현재 UIWindow을 얻으려면 다음 코드를 사용할 수 있습니다.

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

일단 해당 창을 얻으면 직접 회전을 적용하십시오.

그러나 이것은 극복하기가 힘든 많은 가능한 문제를 야기 할 것입니다. (저를 믿으세요. 거기에 티셔츠 컬렉션이 있습니다.) 다른 방법으로 가짜 전체 화면 모드를 사용하는 것이 좋습니다. 를 들어, 다음 또는이

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

등의 슈퍼 뷰의 경계 -

대신 단순히 전체 화면으로 해당 뷰의 프레임 크기를 초기화하지 왜

[moviePlayer setFullscreen:YES animated:YES]; 

을했던 것처럼 플레이어를 초기화 전체 화면 인터페이스를 사용하려면 다음 컨트롤 스타일을 사용하십시오.

moviePlayer.controlStyle = MPMovieControlStyleFullscreen; 

그렇게하면 결과로 나오는 재생이 수퍼 뷰에서 수행 된 모든 변환을 따르게되고 부작용이 없어집니다.

+0

그건 좋은 물건이야. 나는 그것을 알지 못했다. 고맙습니다. 그것은 효과가있다! – applefreak

+0

안녕하세요. MoviePlayer 완료 버튼이 어떤 이벤트를 클릭했는지 아십니까? 일시 중지 된 상태와 동일한 재생 상태를 제공하지만 동일한 것은 아닙니다. 완료 버튼을 클릭하고 방향 변경 이벤트 모니터링을 중단하고 싶습니다. – applefreak

+1

done-button-tap을 처리하는 방법은 다음과 같습니다. 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로 다시 연결됩니다. 이것은 나를 위해 일한

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

     }); 
    } 
} 

, 다음과 같습니다

 [[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을 : 여기에 내가 그것을 실행에 대해 갔다 방법입니다. 희망이 도움이됩니다.

관련 문제