Исчезающая строка состояния вверху после закрытия MPMoviePlayerController - PullRequest
9 голосов
/ 24 августа 2011

Возникла небольшая интересная проблема с моим приложением для iPhone. У меня есть представление с таблицей, и каждая ячейка при нажатии воспроизводит видео в полноэкранном режиме, затем, когда вы нажимаете «Готово», видео останавливается и возвращается к представлению таблицы. Единственная проблема заключается в том, что при нажатии кнопки «Готово» в течение первых 2 или 3 секунд после загрузки видео, когда представление возвращается к представлению таблицы, полоса в верхней части экрана, показывающая время, уровень заряда аккумулятора и т. Д., Больше не отображается. там просто пустое пространство. Но если вы нажмете «Готово» через первые несколько секунд, то когда вы вернетесь к представлению таблицы, все будет в порядке! Я понятия не имею, почему это происходит, и единственное, что я обнаружил в Интернете, это то, что у какого-то парня почти такая же проблема, как у меня:

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;

Если кто-нибудь сможет пролить свет на эту ситуацию, я был бы очень признателен, так как это крайне разочаровывает!

Спасибо

Мэтт

Ответы [ 3 ]

6 голосов
/ 07 февраля 2012

Вместо этого вы можете установить задержку как плавающую.Так что это будет

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, а оригинал был в стиле BlackOpaque.Но теперь работает нормально.

6 голосов
/ 24 августа 2011

Возможно, анимация, когда видео исчезает, вызывает проблему синхронизации с анимацией строки состояния.

попробуйте отложить вызов statusBarHidden = NO на несколько секунд.

NSInteger delay = 3;

dispatch_after(dispatch_time(DISPATCH_TIME_NOW, delay * NSEC_PER_SEC), dispatch_get_current_queue(), ^{
[UIApplication sharedApplication].statusBarHidden = NO;
});
3 голосов
/ 04 июня 2013

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

Регистрация для MPMoviePlayerWillExitFullscreenNotification

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

А затем сбросьте видимость строки состояния И удалите и повторно добавьте rootViewController из главного окна, это позволит убедиться, что границы представления снова верны.

- (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;
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...