2011-08-24 2 views
9

내 iPhone 앱에 재미있는 작은 문제가 있습니다. 표가있는보기가 있고 각 셀을 클릭하면 비디오 전체 화면이 재생 된 다음 완료를 누르면 비디오가 멈추고 다시 테이블보기로 돌아갑니다. 유일한 문제는 비디오 로딩의 처음 2 ~ 3 초 내에 완료를 누르면 뷰가 테이블보기로 돌아갈 때 시간과 배터리 강도 등을 알려주는 화면 상단의 막대가 더 이상 존재하지 않습니다 거기, 그냥 공백. 그러나 처음 몇 초 후에 완료를 누르면 테이블보기로 돌아 가면 모든 것이 완벽합니다! 나는 이런 일이 왜 전혀 생각이없고 내가 인터넷에서 볼 수있는 유일한 것은 나에게로 거의 정확히 같은 문제와 어떤 남자 인 이것이다 :이 사용하려고 저를 이끌어MPMoviePlayerController가 닫힌 후에 맨 위 상태 표시 줄이 사라집니다.

http://www.iphonedevsdk.com/forum/iphone-sdk-development/53020-disappearing-status-bar.html

:

[UIApplication sharedApplication].statusBarHidden = NO; 

그러나이 역시 아무 것도 없습니다.

가 동영상을 클릭 할 때 실행되는 코드 :

NSString *path = [[NSBundle mainBundle] pathForResource:currentTitle ofType:@"m4v"]; 
NSURL *url = [NSURL fileURLWithPath:path]; 
movieController = [[MPMoviePlayerController alloc] initWithContentURL:url]; 
[movieController setControlStyle:MPMovieControlStyleFullscreen]; 
[movieController setFullscreen:YES]; 
movieController.view.frame = self.view.bounds; 
[self.view addSubview:movieController.view]; 

[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(playbackFinished:) name:MPMoviePlayerPlaybackDidFinishNotification object:nil]; 

그리고 실행 코드 중 비디오가 완료 될 때 또는 수행 사용자가 클릭이있을 때 :

NSLog(@"movieController moviePlayBackDidFinish"); 
[[NSNotificationCenter defaultCenter] removeObserver:self name:MPMoviePlayerPlaybackDidFinishNotification object:nil]; 

[movieController setFullscreen:NO animated:NO]; 
[movieController.view removeFromSuperview]; 

[movieController release]; 

LiveEventsView *liveEventsView = [[LiveEventsView alloc] initWithNibName:@"LiveEventsView" bundle:nil]; 
UIView *currentView = self.view; 
UIView *theWindow = [currentView superview]; 
UIView *newView = liveEventsView.view; 
newView.frame = CGRectMake(0, 20, 320, 460); 
[currentView removeFromSuperview]; 
[theWindow addSubview:newView]; 
[UIApplication sharedApplication].statusBarHidden = NO; 

하는 경우 누구나이 상황에 어떤 빛이라도 흘릴 수 있습니다. 매우 실망 스럽기 때문에 나는 매우 감사 할 것입니다!

감사합니다,

매트 어쩌면

답변

6

비디오보기가 상태 표시 줄 애니메이션 타이밍 문제의 원인이 사라지면에서 애니메이션.

statusBarHidden = NO 호출을 몇 초 지연하십시오.

NSInteger delay = 3; 

dispatch_after(dispatch_time(DISPATCH_TIME_NOW, delay * NSEC_PER_SEC), dispatch_get_current_queue(), ^{ 
[UIApplication sharedApplication].statusBarHidden = NO; 
}); 
+0

감사합니다.이 방법이 효과적이지만 지연 시간이 가장 짧은 것으로 생각되는 이유는 1 초가 너무 길기 때문입니다. 그 문제를 해결할 수있는 유일한 방법이라면, 그렇게 할 것이지만, 1 초 후에 뷰가로드되는 즉시 표시하는 것이 바람직합니다. –

6

지연을 대신 float로 설정할 수 있습니다. 그래서 저도 같은 문제를 겪고 및 richerd의 코드를 약간 수정하여 그것을 해결

float delay = 0.1; 

    dispatch_after(dispatch_time(DISPATCH_TIME_NOW, delay * NSEC_PER_SEC), dispatch_get_current_queue(), ^{ 
     [UIApplication sharedApplication].statusBarHidden = NO; 
     [UIApplication sharedApplication].statusBarStyle = UIStatusBarStyleBlackOpaque; 
    }); 

될 것이다. 0.1 초는 받아 들일 수 있습니다. BlackTranslucent bar 스타일을 반환하고 BlackOpaque 스타일의 원본이기 때문에 상태 표시 줄 스타일을 변경해야했습니다. 하지만 지금은 잘 작동합니다.

3

주어진 솔루션을 사용하면 콘텐츠가 상태 표시 줄 아래에 사라지는 경우가 종종 있습니다. 이 접근법은 그것을 수정합니다.

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

그리고 상태 표시 줄 가시성을 재설정 및 제거하고 메인 창에서 rootViewController을 다시 추가 MPMoviePlayerWillExitFullscreenNotification

에 대한

등록이 뷰의 경계가 다시 올바른지 확인합니다.

- (void)moviePlayerWillExitFullscreen:(NSNotification *)notification { 
    [[UIApplication sharedApplication] setStatusBarHidden:NO withAnimation:UIStatusBarAnimationSlide]; 
    AppDelegate *appDelegate = [UIApplication sharedApplication].delegate; 

    id rootViewController = appDelegate.window.rootViewController; 
    appDelegate.window.rootViewController = nil; 
    appDelegate.window.rootViewController = rootViewController; 
}