Скрыть StatusBar от MPMoviePlayerController
Я изо дня в день борется с очень раздражающей проблемой, и я надеюсь, что смогу найти помощь на этой доске.
Я использую 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 без везения.
Может ли кто-нибудь помочь мне в этом?
Спасибо заранее.
Ответы
Ответ 1
К сожалению, после того, как я столкнулся с этой проблемой, проведя исследования и много экспериментов, я решил, что сохранить статус строки состояния iOS в полноэкранном режиме практически невозможно. Независимо от того, что вы делаете, когда отображаются элементы управления полноэкранным проигрывателем, так же будет строка состояния (она не будет уважать setStatusBarHidden:YES
). Это не относится к встроенным элементам управления плеером, но пользователь может легко переключаться между встроенными и полноэкранными режимами, поэтому вы не можете использовать это для поддержания состояния, когда отображаются элементы управления.
Конечно, по крайней мере, строка состояния уходит, когда элементы управления исчезают...
Ответ 2
Не добавляйте просмотр фильма на главный экран; вместо этого, представить фильм-плеер следующим образом (некоторые шаги опущены для краткости/ясности):
moviePlayerViewController = [[MPMoviePlayerViewController alloc] initWithContentURL:url];
// Register for the playback finished notification.
[[NSNotificationCenter defaultCenter] addObserver:self
selector:@selector(myMovieFinishedCallback:)
name:MPMoviePlayerPlaybackDidFinishNotification
object:moviePlayerViewController.moviePlayer];
//Present
[self presentMoviePlayerViewControllerAnimated:moviePlayerViewController];
// Play the movie!
self.moviePlayerViewController.moviePlayer.movieSourceType = MPMovieSourceTypeFile;
[self.moviePlayerViewController.moviePlayer play];
// When the movie is done, release the controller.
-(void)myMovieFinishedCallback:(NSNotification*)aNotification
{
//NSLog(@"playback terminated");
[[NSNotificationCenter defaultCenter] removeObserver:self
name:MPMoviePlayerPlaybackDidFinishNotification
object:moviePlayerViewController.moviePlayer];
[moviePlayerViewController release], moviePlayerViewController = nil;
}
Ответ 3
Это помогло мне использовать 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).
Ответ 4
Строка состояния скрывалась, но снова показывалась с помощью управления воспроизведением.
-(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];
}
Ответ 5
Использование 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];
Ответ 6
Это не ответ, у меня такая же проблема. Однако есть одна часть, которую я могу обновить.
Строка состояния отображается только тогда, когда отображаются элементы управления.
Нажав на фильм, скрывает конроли и строку состояния, снова нажимает, показывает элементы управления, и строка состояния снова возвращается.
Я также скрываю строку состояния программным образом непосредственно перед запуском фильма.
[[UIApplication sharedApplication] setStatusBarHidden:YES withAnimation:NO];
и вот как я добавляю фильм:
[[[UIApplication sharedApplication] keyWindow] addSubview: movieView];
Ответ 7
Для тех, кто сталкивался с этой проблемой, я нашел решение, которое может помочь. Это применимо только в том случае, если остальная часть вашего приложения не отображает строку состояния, и если вы пытаетесь скрыть ее снова, как только фильм будет выполнен, и вернитесь к интерфейсу, а не во время воспроизведения.
Если ваш MPMoviePlayerController добавляется в качестве подсмотра в UIView, который помещается в стек представления диспетчера навигации, вы можете использовать этот метод просмотра viewLillDisappear для родительского представления, чтобы помочь вам.
В этом методе вы можете изменить стиль управления на none, который очистит все элементы управления проигрывателем до того, как исчезнет вид, и очистит строку состояния, если вы уже установили ее скрытую. Это будет совершенно неподходящим для пользователя, поскольку представление перемещается с экрана, и они больше не взаимодействуют с ним.
Ответ 8
У меня была такая же проблема, но я добавил в свою строку info.plist
Status bar is initially hidden - Boolean - YES
, и она работает!
BTW Я использую iOS 5.1, Xcode 4.3.2.
Ответ 9
Я не знаю, применимо ли мое решение к вашей проблеме, но оно работает для моей настройки, то есть 4-го поколения ipod с 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
, чтобы предотвратить любые элементы управления, но по существу строка состояния отображается, когда фильм-плеер удаляется из родительского представления.