2010-09-06 12 views
14

Przez cały dzień borykałem się z bardzo irytującym problemem i mam nadzieję, że znajdę pomoc na tym forum.Ukryj StatusBar z MPMoviePlayerController

Używam MPMoviePlayerController do odtwarzania pełnoekranowego filmu na iPadzie i nie mogę sobie wyobrazić, jak usunąć pasek stanu, który jest zawsze wyświetlany pomimo wszystkich moich wysiłków, aby doprowadzić go do piekła.

Oto kod metody użyć, aby wyświetlić ten film:

-(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); 

    } 

W konsoli widzę, że moviePlayerEvent jest zwolniony, gdy pojawi się film, ale pasek stanu jest nadal istnieje: [[UIApplication sharedApplication] setStatusBarHidden: YES withAnimation: NO] wydaje się nie działać. Próbowałem użyć innych powiadomień MPMoviePlayerController bez powodzenia.

Czy ktoś może mi pomóc w tej sprawie?

Z góry dziękuję.

Odpowiedz

9

Nie dodawaj widoku odtwarzacza filmowego do głównego widoku; Zamiast przedstawić odtwarzacz filmowy modally następująco (pewne kroki pominięte dla zwięzłości/jasność):

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; 


} 
0

nie jest to odpowiedź, mam ten sam problem. Jest jedna część, którą mogę zaktualizować, jednak ..

Pasek stanu pojawia się tylko wtedy, gdy kontrolki się wyświetlają.

Kliknięcie filmu powoduje ukrycie kontrolek & na pasku stanu, ponowne kliknięcie, pokazuje elementy sterujące, a pasek stanu również wraca.

Również ukrywam pasek stanu programowo tuż przed uruchomieniem filmu.

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

i oto jak dodaję ten film:

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

1

Pasek stanu nie hided, ale pokazuje się ponownie z kontrolą odtwarzania.

-(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]; 
} 
22

Niestety, po uruchomieniu do tego samego problemu, poprzez badania i wielu eksperymentach, jakie ustalił, że to jest dość dużo niemożliwe, aby utrzymać pasek stanu iOS ukryty w trybie pełnoekranowym. Bez względu na to, co robisz, gdy wyświetlane są elementy sterujące odtwarzacza na pełnym ekranie, tak samo pasek stanu (nie będzie zgodny z setStatusBarHidden:YES). Nie dotyczy to elementów sterujących odtwarzacza, ale użytkownik może łatwo przełączać się między trybami osadzonymi i pełnoekranowymi, więc nie można tego naprawdę użyć, aby nie wyświetlać paska stanu po wyświetleniu elementów sterujących.

Oczywiście, przynajmniej pasek stanu odchodzi gdy kontrole znikną ...

+0

+1 dla poprawnej odpowiedzi. Proszę złożyć zgłoszenie błędu dotyczące tego problemu. – Till

+0

Tak głupi, mam pusty pasek stanu i nie mogę się go pozbyć. – EladG

0

Dla tych, które zostały uruchomione w tej kwestii, Znalazłem roztwór własne, które mogą pomóc. Obowiązuje to jednak tylko wtedy, gdy reszta aplikacji nie pokazuje paska stanu i jeśli próbujesz ukryć ją ponownie po zakończeniu filmu i powrocie do interfejsu, zamiast podczas odtwarzania.

Jeśli Twój MPMoviePlayerController jest dodawany jako widok podrzędny do UIView, który jest przesyłany na stos widoku kontrolera nawigacyjnego, możesz użyć metody viewWillDiscear kontrolera widoku rodzica, aby ci pomóc.

W tej metodzie można zmienić styl sterowania na Brak, który usunie wszystkie kontrolki odtwarzacza filmowego, zanim zniknie widok i usunie pasek stanu, jeśli został już ustawiony jako ukryty. Będzie to zupełnie nieprzykrywalne dla użytkownika, ponieważ widok znika z ekranu i nie wchodzą już z nim w interakcję.

0

Miałem ten sam problem, ale dodałem do mojego info.plist wiersza Status bar is initially hidden - Boolean - YES i to działa!
BTW Używam iOS 5.1, Xcode 4.3.2.

+0

To zadziała, chyba że chcesz mieć pasek stanu dla swojej aplikacji, ale nie dla filmu. – Cthutu

+1

Mam "Pasek stanu jest początkowo ukryty" ustawiony na "TAK" (aplikacja OpenGL ES), ale pasek statusu pojawia się, gdy przedstawiam 'MPMoviePlayerController' modalnie. –

+0

Mam również ukryty pasek stanu na TAK i nadal otrzymuję pasek stanu. Odpowiedź rcw3 jest poprawna, jeśli używasz pełnoekranowych kontrolek, nie możesz ukryć paska stanu. –

1

Korzystanie MPMovieControlModeVolumeHidden nie działa dla mnie, jedynym, który pracował był MPMovieControlModeVolumeOnly z wideo w trybie pełnoekranowym:

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

a także, dodaję pogląd filmowy jako podrzędny do widoku macierzystego:

[parentView addSubview:myMoviePlayer.view]; 

Moja aplikacja ma nie mieć pasek stanu i dla wstecznej kompatybilności używam następujący kod w App delegat:

if([[UIApplication sharedApplication] respondsToSelector:@selector(setStatusBarHidden: withAnimation:)]) 
    [[UIApplication sharedApplication] setStatusBarHidden:YES withAnimation:UIStatusBarAnimationNone]; 
else 
    [[UIApplication sharedApplication] setStatusBarHidden:YES animated:NO]; 
2

on pracował dla mnie, aby korzystać MPMoviePlayerViewController, konfigurowania następujące

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

zanim to:

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

oraz następujące zaraz po:

moviePlayerController.moviePlayer.controlStyle = MPMovieControlStyleNone; 

tylko w przypadku, zrobiłem też to:

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

     ... 
    } 
} 

A więc brak pasków stanu, brak kontroli ... nic oprócz czystego wideo.)

(Testowany na urządzeniu iOS 5.1 i symulatorze 6.0).

+0

Dość smutne wieści ... Nie zauważyłem najpierw, ale wydaje się, że kiedy ukrywamy wszystko w filmie, to pasek statusu nie pojawia się na zamknięciu filmu. To oczywiście błąd w systemie iOS, ponieważ nie może on zniknąć, ponieważ nie robię bezpośrednio z nim nic ... i pojawia się po tym, gdy na przykład otworzę jakiś kontroler modalny, który prawdopodobnie "odświeża" aplikację kontekst czy coś. W każdym razie ... aby pasek stanu nadal się pojawił, właśnie łapię ostatnią chwilę, kiedy film się kończy i robię moviePlayerController.moviePlayer.controlStyle = MPMovieControlStyleFullscreen; – Agat

+0

Muszę również ręcznie zatrzymać wideo [moviePlayerController.moviePlayer stop]; po ręcznym usunięciu kontrolera filmu, w przeciwnym razie albo pozostanie czarny ekran, albo dźwięk wideo będzie odtwarzany w tle, gdy kontroler już zniknie. A więc "zabawne" zachowanie iOS. W chwili, w której film wideo "zakończy się", opisano tutaj: http://stackoverflow.com/a/13318267/691660. Powodzenia dla nas wszystkich!) – Agat

0

Nie wiem, czy moje rozwiązanie dotyczy Twojego problemu, ale działa w przypadku mojej konfiguracji, tj. 4. generacji iPoda z systemem iOS 5.1.

Moje aplikacje nie pokazują w ogóle paska stanu, aw pliku info.plist odpowiadający wpis "Pasek stanu jest początkowo ukryty" ustawiony jest na TAK.

Dodaję również bezpośrednio widok MPMoviePlayerController do jego widoku macierzystego. Oto kod do ustawienia odtwarzacza filmów:

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

FilmPlayer jest zmienną klasy.

Gdy gracz zakończeniu odtwarzania lub gdy widz naciska przycisk „Gotowe” kontrolera movieplayer metoda playbackFinished: nazywa się:

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

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

W jakim stylu kontrola movieplayer jest ustawiony na MPMovieControlStyleNone do zapobiec wszelkim kontrolom, ale w zasadzie pasek stanu pojawia się, gdy filmPlayer zostanie usunięty z widoku nadrzędnego.

Powiązane problemy