Чрезвычайно странное поведение навигацииBar и MPMoviePlayerController.Ошибка в iOS или моя ошибка? - PullRequest
6 голосов
/ 02 декабря 2011

У меня есть MPMoviePlayerController объект, который воспроизводит видео в полноэкранном режиме в книжной или альбомной ориентации. Если я поворачиваю ориентацию во время воспроизведения видео и выполняю поворот в течение нескольких секунд после начала воспроизведения видео, и отображается строка состояния видео, когда видео заканчивается, моя навигационная панель в порядке. Но если я подожду, пока строка состояния видео не исчезнет на несколько секунд во время воспроизведения видео, а затем поверну ориентацию, когда видео закончится, мой navigationBar будет частично скрыт за строкой состояния, как нажатие вверх.

Вы когда-нибудь видели что-то подобное?

Я могу легко воссоздать эту ошибку. Я создал новое приложение Single View и просто добавил кнопку и панель навигации. Если я поворачиваю ориентацию во время воспроизведения видео, нажмите, чтобы включить полноэкранный режим, и строка состояния видео все еще видна, когда видео заканчивается, все в порядке. Но если я жду поворота после исчезновения строки состояния видео, когда я поворачиваюсь и видео заканчивается, панель навигации находится под строкой состояния. Смотрите изображение:

Изображение iPhone

Вот простой код, который я использую:

- (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 метод:

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

Ответы [ 3 ]

5 голосов
/ 14 января 2012

Хорошо, я обнаружил эту чертову ошибку во всем приложении сначала в UIWebView, а затем в MPMoviePlayerController. Я решил эту проблему, поместив этот код в свой контроллер представления..

5 голосов
/ 04 декабря 2011

Если вы прослушиваете уведомление MPMoviePlayerWillExitFullscreenNotification, вы можете принудительно перерисовать основные виды следующим образом. Ссылка на 'window' является основным объектом вашего приложения 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];
3 голосов
/ 15 октября 2012
- (void) moviePlayerWillExitFullScreen:(id)sender {

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

}

Ребята, попробуйте это ... У меня это работает. Я пробовал много других способов, и только этот работал.

...