Скрыть StatusBar от MPMoviePlayerController - PullRequest
15 голосов
/ 06 сентября 2010

Я целый день боролся с очень раздражающей проблемой, и надеюсь, что смогу найти помощь на этой доске.

Я использую MPMoviePlayerController для воспроизведения полноэкранного фильма на iPad, и я могу 'не понимаю, как удалить строку состояния, которая всегда отображается, несмотря на все мои попытки заставить ее пойти в ад.

Вот код метода, который я использую для отображения фильма:

-(void)launchVideoFromButton:(id)sender{

         NSString *videoPath = [[NSBundle mainBundle] pathForResource:@"movie01" ofType:@"m4v"];
         NSURL *videoPathURL = [NSURL fileURLWithPath:videoPath];
         moviePlayer = [[MPMoviePlayerController alloc] initWithContentURL:videoPathURL];

         [self.view addSubview:moviePlayer.view];

         moviePlayer.shouldAutoplay = YES;
         moviePlayer.movieSourceType = MPMovieSourceTypeFile;


         [moviePlayer setFullscreen:YES animated:YES];
         moviePlayer.controlStyle = MPMovieControlStyleFullscreen;

         NSNotificationCenter *notificationCenter = [NSNotificationCenter defaultCenter];
         [notificationCenter addObserver:self selector:@selector(moviePlayerEvent:) name:MPMoviePlayerLoadStateDidChangeNotification object:moviePlayer];

    }



    -(void)moviePlayerEvent:(NSNotification*)aNotification{

         [[UIApplication sharedApplication] setStatusBarHidden:YES withAnimation:NO];
         NSLog(@"%i", [UIApplication sharedApplication].statusBarHidden);

    }

В консоли я вижу, что moviePlayerEvent запускается, когда фильм появляется, но строка состояния все еще там: [[UIApplication sharedApplication] setStatusBarHidden: YES withAnimation: NO], кажется, не работает.Я безуспешно пытался использовать другие уведомления MPMoviePlayerController.

Может ли кто-нибудь помочь мне в этом?

Заранее спасибо.

Ответы [ 9 ]

22 голосов
/ 22 апреля 2011

К сожалению, после того, как я столкнулся с этой самой проблемой, благодаря исследованиям и многочисленным экспериментам, я решил, что практически невозможно скрыть строку состояния iOS в полноэкранном режиме.Независимо от того, что вы делаете, когда отображаются полноэкранные элементы управления плеером, будет отображаться строка состояния (она не будет соответствовать setStatusBarHidden:YES).Это не относится к встроенным элементам управления проигрывателем, но пользователь может легко переключаться между встроенным и полноэкранным режимами, поэтому вы не можете использовать его, чтобы не отображать строку состояния при отображении элементов управления.

Конечно, по крайней мере строка состояния исчезает, когда исчезают элементы управления ...

9 голосов
/ 06 сентября 2010

Не добавляйте вид видеоплеера на основной вид;вместо этого представьте видеоплеер модально следующим образом (некоторые шаги для краткости / ясности не указаны):

2 голосов
/ 10 ноября 2012

У меня получилось использовать MPMoviePlayerViewController, настроив перед этим

[moviePlayerController.moviePlayer setFullscreen:YES animated:NO];
moviePlayerController.moviePlayer.controlStyle = MPMovieControlStyleFullscreen;

:

[self presentViewController:moviePlayerController animated:NO completion:^{ }];

и сразу после:

moviePlayerController.moviePlayer.controlStyle = MPMovieControlStyleNone;

на всякий случай, я тоже сделал это:

[[NSNotificationCenter defaultCenter] addObserver:self
                                             selector:@selector(moviePlayerLoadStateDidChange:)
                                                 name:MPMoviePlayerLoadStateDidChangeNotification object:nil];

...


- (void)moviePlayerLoadStateDidChange:(NSNotification *)notification {


    if ([[moviePlayerController moviePlayer] loadState] == MPMovieLoadStateStalled) {

    } else if([[moviePlayerController moviePlayer] loadState] != MPMovieLoadStateUnknown) {

        [moviePlayerController moviePlayer].controlStyle = MPMovieControlStyleNone;

        ...
    }
}

Итак, никаких строк состояния, никаких элементов управления ... ничего, кроме только чистого видео.)

(протестировано на устройстве iOS 5.1 и симуляторе 6.0).

1 голос
/ 02 октября 2012

Использование MPMovieControlModeVolumeHidden не сработало для меня, единственное, что сработало, было MPMovieControlModeVolumeOnly с видео в полноэкранном режиме:

myMoviePlayer.controlStyle = MPMovieControlModeVolumeOnly;
[myMoviePlayer setFullscreen:YES];

А также я добавляю вид фильма в качестве подпредставления к родительскому виду:

[parentView addSubview:myMoviePlayer.view];

В моем приложении не должно быть строки состояния, и для обратной совместимости я использую следующий код в делегате приложения:

if([[UIApplication sharedApplication] respondsToSelector:@selector(setStatusBarHidden: withAnimation:)])
    [[UIApplication sharedApplication] setStatusBarHidden:YES withAnimation:UIStatusBarAnimationNone];
else
    [[UIApplication sharedApplication] setStatusBarHidden:YES animated:NO];
1 голос
/ 16 декабря 2010

Строка состояния скрылась, но снова появилась с управлением воспроизведением.

  -(void)viewDidLoad:{
        [super viewDidLoad];
        MPMoviePlayerViewController *moviePlayerViewController =
                [[MPMoviePlayerViewController alloc] initWithContentURL:videoURL];

        [[NSNotificationCenter defaultCenter] addObserver:self 
                 selector:@selector(playbackStateChange:)
                 name:MPMoviePlayerLoadStateDidChangeNotification
                 object:moviePlayerViewController.moviePlayer];
    }
    -(void)playbackStateChange:(NSNotification*)notification{
        if([[UIApplication sharedApplication]respondsToSelector:@selector(setStatusBarHidden: withAnimation:)])
        [[UIApplication sharedApplication] setStatusBarHidden:YES 
                       withAnimation:UIStatusBarAnimationNone];
        else 
            [[UIApplication sharedApplication] setStatusBarHidden:YES animated:NO];
}
0 голосов
/ 19 сентября 2013

Я не знаю, применимо ли мое решение к вашей проблеме, но оно работает для моей установки, т.е. ipod 4-го поколения под управлением iOS 5.1.

Мои приложения вообще не отображают строку состояния, и вВ файле info.plist соответствующая запись «Строка состояния изначально скрыта» установлена ​​в YES.

Я также напрямую добавляю представление MPMoviePlayerController в его родительское представление.Вот код для настройки проигрывателя фильмов:

moviePlayer = [[MPMoviePlayerController alloc] initWithContentURL:theurl];
[moviePlayer.view setFrame:frame]; // This is set to (0, 0, 320, 480)
[moviePlayer prepareToPlay];
[moviePlayer setShouldAutoplay:YES]; 
moviePlayer.fullscreen = TRUE;
moviePlayer.controlStyle = MPMovieControlStyleFullscreen;
[self.view addSubview:moviePlayer.view];

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

MoviePlayer является переменной класса.

Когда проигрыватель заканчивает воспроизведение или когда зритель нажимает кнопку «Готово» на проигрывателе moviePlayerВ контроллере вызывается метод playbackFinished::

- (void)playBackFinished:(NSNotification *)notif{
moviePlayer.controlStyle = MPMovieControlStyleNone;
[moviePlayer stop];
[moviePlayer.view removeFromSuperview];

[[NSNotificationCenter defaultCenter] removeObserver:self name:MPMoviePlayerPlaybackDidFinishNotification object:moviePlayer];
[moviePlayer release];
moviePlayer = nil;
}

, в котором стиль элемента управления moviePlayer установлен на MPMovieControlStyleNone, чтобы запретить какие-либо элементы управления, но, по сути, строка состояния отображается, когда moviePlayerудалено из родительского представления.

0 голосов
/ 24 мая 2012

У меня была такая же проблема, но я добавил в свою info.plist строку Status bar is initially hidden - Boolean - YES, и она работает!
Кстати, я использую iOS 5.1, Xcode 4.3.2.

0 голосов
/ 15 декабря 2011

Для тех, кто сталкивался с этой проблемой, я нашел собственное решение, которое могло бы помочь.Это применимо только в том случае, если в остальной части вашего приложения строка состояния не отображается и вы пытаетесь скрыть ее снова после завершения воспроизведения фильма и возврата к интерфейсу, а не во время воспроизведения.

Если ваш MPMoviePlayerControllerдобавляется как подпредставление в UIView, который помещается в стек представлений контроллера навигации, вы можете использовать метод viewWillDisappear этого родительского контроллера, чтобы выручить вас.

В этом методе вы можете изменить стиль элемента управления на none, что очистит все элементы управления проигрывателя фильмов до того, как представление исчезнет, ​​а также очистит строку состояния, если вы уже установили ее скрытым.Это будет совершенно невидимым для пользователя, поскольку представление переходит за пределы экрана, и они больше не взаимодействуют с ним.

0 голосов
/ 06 декабря 2010

это не ответ, у меня та же проблема. Однако есть одна часть, которую я могу обновить.

Строка состояния отображается только тогда, когда отображаются элементы управления.

Нажатие на фильм, скрытие элементов управления и строки состояния, повторное нажатие, отображение элементов управления, и строка состояния также возвращается.

Я также скрываю строку состояния программно перед запуском фильма.

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

и вот как я добавляю фильм:

[[[UIApplication sharedApplication] keyWindow] addSubview: movieView];

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...