2011-12-02 2 views
6

가로 세로 또는 세로로 비디오 전체 화면을 재생하는 MPMoviePlayerController 개체가 있습니다. 비디오가 재생되는 동안 방향을 회전시키고 비디오 재생이 시작되고 비디오 상태 표시 줄이 보이면 몇 초 이내에 회전을 수행하면 비디오가 내 탐색 막대를 끝낼 때 완벽합니다. 그러나 비디오 상태 표시 줄이 몇 초 동안 비디오가 재생 될 때까지 기다렸다가 방향을 회전하면 비디오가 끝날 때 navigationBar이 부분적으로 상태 표시 줄 뒤에 숨겨집니다.navigationBar 및 MPMoviePlayerController의 동작이 매우 이상합니다. IOS 또는 내 오류의 버그?

이런 것을 본 적이 있습니까?

이 버그를 쉽게 다시 만들 수 있습니다. 새로운 Single View App을 만들고 버튼과 탐색 바를 추가했습니다. 비디오가 재생되는 동안 방향을 돌리면 전체 화면을 활성화하고 동영상 상태 표시 줄은 비디오가 끝나면 여전히 볼 수 있습니다. 모두 훌륭합니다. 그러나 비디오 상태 표시 줄이 사라진 후 회전하기를 기다리면 회전하고 비디오가 끝나면 탐색 모음이 상태 표시 줄 아래에 있습니다. 이미지보기 : 여기

iPhone Image

내가 사용하고있는 간단한 코드입니다 : 나는 아래의 제안에 현재 어딘지

다음
- (void) playMovie { 
NSURL *url = [NSURL fileURLWithPath:[[NSBundle mainBundle] pathForResource: @"movie" ofType: @"mov"]]; 
moviePlayer = [[MPMoviePlayerController alloc] initWithContentURL: url]; 

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

moviePlayer.controlStyle = MPMovieControlStyleDefault; 
moviePlayer.shouldAutoplay = YES; 

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

- (void) moviePlayBackDidFinish: (NSNotification *) notification 
    MPMoviePlayerController *player = [notification object]; 
[[NSNotificationCenter defaultCenter] removeObserver: self 
               name: MPMoviePlayerPlaybackDidFinishNotification 
               object: player]; 

if ([player respondsToSelector: @selector(setFullscreen:animated:)]) 
{ 
    [player.view removeFromSuperview]; 
} 

입니다. 불행히도 나는 여전히 같은 문제가 있기 때문에 나는 틀린 것이있을 것입니다. 여기

는 방법 onPlayerWillExitFullScreen

UIView *view = [[[UIApplication sharedApplication] delegate].window.subviews lastObject];  
if (view) { 
    [view removeFromSuperview]; 
    [[[UIApplication sharedApplication] delegate].window addSubview:view]; 
} 

MPMoviePlayerController *player = [aNotification object]; 
[[NSNotificationCenter defaultCenter] removeObserver: self 
               name: MPMoviePlayerWillExitFullscreenNotification 
               object: player];  

이며, 여기에 내 현재 playMovie 방법 : 당신이 MPMoviePlayerWillExitFullscreenNotification 알림을 수신하는 경우

NSURL *url = [NSURL fileURLWithPath:[[NSBundle mainBundle] pathForResource: @"movie" ofType: @"mov"]]; 
moviePlayer = [[MPMoviePlayerController alloc] initWithContentURL: url]; 

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

[[NSNotificationCenter defaultCenter]addObserver: self 
             selector: @selector(onPlayerWillExitFullScreen:) 
              name: MPMoviePlayerWillExitFullscreenNotification 
              object: self.moviePlayer]; 

moviePlayer.controlStyle = MPMovieControlStyleDefault; 
moviePlayer.shouldAutoplay = YES; 

[self.view addSubview: moviePlayer.view]; 
[moviePlayer setFullscreen: YES animated: YES]; 
+0

스크린 샷 또는 두 개를 포함 할 수 있습니다. –

+0

Jeff에게 제안을 주셔서 감사합니다. –

+0

스크린 샷에 대한 링크가 끊어졌습니다. – JonasCz

답변

5

이 좋아, 그래서 내가 내보기 컨트롤러이 배치이 코드를 해결하는 MPMoviePlayerController에 다음의 UIWebView에서 먼저 내 응용 프로그램을 통해이 괴물 같은 버그를 발견했다.

- (void)willRotateToInterfaceOrientation:(UIInterfaceOrientation)toInterfaceOrientation duration:(NSTimeInterval)duration { 
    [self.navigationController setNavigationBarHidden:YES animated:YES]; 
    [self.navigationController setNavigationBarHidden:NO animated:YES]; 
} 

까다로운 버그, 까다로운 수정.

+0

마침내! 정말 고마워요. (NSNotification *) aNotification –

+0

마침내 고마워요 !! –

+0

멋진 트릭이 iOS 5.0에서 작동했습니다. – rakeshNS

5

, 당신은 다음과 같이 제대로 다시 그릴 메인 뷰를 강제 할 수 . 참조 된 '창'은 응용 프로그램의 기본 UIWindow 객체입니다.

MPMoviePlayerController를 전체 화면으로 전환하면 실제로 별도의 UIWindow 인스턴스가 만들어져 비디오가 표시됩니다. 전환 될 때 알림을 잡아 냄으로써이 코드는 다시 전환하려는보기가 올바르게 재정렬되도록합니다.

분명히 이것은 우아한 해결책은 아니지만 매번 작동합니다.

UIView *view = [window.subviews lastObject]; 
if (view) { 
    [view removeFromSuperview]; 
    [window addSubview:view]; 
} 

이 통지, 당신은 self.playerController이 MPMoviePlayerController 객체입니다 이런 식으로 뭔가를해야 할 것 들으려면.

플레이어를 출시하면이 알림을 수신하는 것을 잊지 마세요!

// Determine the default notification centre 
    NSNotificationCenter *centre = [NSNotificationCenter defaultCenter]; 
    // Listen for interesting movie player notifications 
    [centre addObserver: self 
       selector: @selector(onPlayerWillExitFullScreen:) 
        name: MPMoviePlayerWillExitFullscreenNotification 
       object: self.playerController]; 
+0

도움 주셔서 감사합니다. 나는 프로그래밍에 익숙하지 않으므로 그 통지를 구현하는 방법을 확실히 알지 못한다. 그러나 나는 그것을 한 번 제공 할 것이다. 나는 해결책이 있음을 아는 데 안도의 한숨이다. –

+0

내 답변이 업데이트되었습니다. – reddersky

+0

UIWindow 객체에 대해 혼란스러워합니다. 내 간단한 테스트 응용 프로그램을 가져 가면 버튼과 탐색 모음이있는 단일보기 응용 프로그램 만 있습니다. 나는 "self.view"로 하위 윈도우를 만들려고했으나 정확하지 않아야한다. –

3
- (void) moviePlayerWillExitFullScreen:(id)sender { 

[[UIApplication sharedApplication]setStatusBarHidden:NO withAnimation:NO]; 

} 

친구들이 시도해보세요 ... 저에게 효과적입니다.나는 다른 많은 방법을 시도하고 오직이 것이 효과가 있었다.

관련 문제