2010-09-06 19 views
14

He estado luchando con un problema muy molesto todo el día y espero poder encontrar ayuda en este foro.Ocultar StatusBar de MPMoviePlayerController

Estoy usando un MPMoviePlayerController para reproducir una película a pantalla completa en iPad y no sé cómo quitar la barra de estado que siempre se muestra a pesar de todos mis esfuerzos para hacer que se vaya al infierno.

Este es el código del método que utilizo para visualizar la película:

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

    } 

En la consola, puedo ver que moviePlayerEvent se dispara cuando aparezca la película, pero la barra de estado sigue ahí: [[UIApplication sharedApplication] setStatusBarHidden: YES withAnimation: NO] parece estar inoperante. He intentado usar las otras notificaciones de MPMoviePlayerController sin suerte.

¿Alguien podría ayudarme en eso?

Gracias de antemano.

Respuesta

9

No agregue la vista del reproductor de películas a su vista principal; en cambio, presentar el reproductor de películas de forma modal de la siguiente manera (algunos pasos omitidos por razones de brevedad/claridad):

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

esto no es una respuesta, estoy teniendo el mismo problema. Sin embargo, hay una parte que puedo actualizar.

La barra de estado solo se muestra cuando se muestran los controles.

Al hacer clic en la película, se oculta la barra de estado &, al hacer clic de nuevo, se muestran los controles y la barra de estado vuelve también.

También estoy ocultando la barra de estado programáticamente justo antes de iniciar la película.

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

y así es como estoy añadiendo la película:

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

1

La barra de estado se escondió, pero mostrando de nuevo con el control del juego.

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

Por desgracia, después de funcionar en este mismo problema, a través de la investigación y de mucha experimentación, he determinado que es prácticamente imposible mantener la barra de estado iOS oculto en modo de pantalla completa. Independientemente de lo que haga, cuando se muestren los controles del reproductor de pantalla completa, también lo hará la barra de estado (no respetará el setStatusBarHidden:YES). Este no es el caso con los controles del reproductor incrustado, pero el usuario puede cambiar fácilmente entre los modos de pantalla integrada y completa, por lo que no puede usar esto para mantener ninguna barra de estado cuando se muestran los controles.

Por supuesto, al menos la barra de estado desaparece cuando los controles se desvanecen ...

+0

+1 para la respuesta correcta. Por favor presente un informe de error sobre este problema. – Till

+0

Tan estúpido, tengo una barra de estado vacía y no me puedo deshacer de ella. – EladG

0

Para aquellos que han estado funcionando en este tema, he encontrado una solución de mi propia que podría ayudar. Sin embargo, solo se aplica si el resto de su aplicación no muestra la barra de estado y si está tratando de ocultarla nuevamente una vez que la película finaliza y regresa a su interfaz, en lugar de durante la reproducción.

Si su MPMoviePlayerController se está agregando como subvista a una UIView que está siendo empujada a una pila de vista de controlador de navegación, puede usar el método viewWillDisappear de ese controlador de vista parental para ayudarlo.

En ese método, puede cambiar el estilo de control a none, lo que eliminará todos y cada uno de los controles del reproductor de películas antes de que la vista desaparezca y borra la barra de estado si ya la tiene oculta. Esto no será completamente visible para el usuario ya que la vista se está moviendo fuera de la pantalla y ya no interactúa con ella.

0

Tuve el mismo problema pero agregué a mi info.plist fila Status bar is initially hidden - Boolean - YES y funciona!
BTW Estoy usando iOS 5.1, Xcode 4.3.2.

+0

Esto funcionará a menos que desee la barra de estado para su aplicación, pero no para la película. – Cthutu

+1

Tengo 'Barra de estado inicialmente oculta' establecida en 'SÍ '(aplicación OpenGL ES), sin embargo, la barra de estado aparece cuando presento' MPMoviePlayerController 'modalmente. –

+0

Tengo la barra de estado oculta establecida en SÍ también y sigo recibiendo una barra de estado. La respuesta de rcw3 es correcta, si está utilizando controles de pantalla completa, no puede ocultar la barra de estado. –

1

Usando MPMovieControlModeVolumeHidden no funcionó para mí, el único que trabajaba era MPMovieControlModeVolumeOnly con el vídeo en pantalla completa:

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

Y también, estoy añadiendo la vista película como una subvista a la vista padre:

[parentView addSubview:myMoviePlayer.view]; 

Mi aplicación se supone que no tiene barra de estado y de la compatibilidad hacia atrás Puedo usar el siguiente código en el delegado de la aplicación:

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

que trabajó para mí utilizar MPMoviePlayerViewController, la creación de la siguiente

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

antes de esto:

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

y la siguiente justo después:

moviePlayerController.moviePlayer.controlStyle = MPMovieControlStyleNone; 

solo en caso, también hice esto:

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

     ... 
    } 
} 

Entonces, sin barras de estado, sin controles ... nada más que solo un video puro.)

(probado en el dispositivo iOS 5.1 y el simulador 6.0).

+0

Noticias bastante tristes ... No me di cuenta primero, pero parece que cuando ocultamos todo en la reproducción de la película, la barra de estado no aparece en el cierre de la película. Eso es obviamente un error en iOS, ya que no debe desaparecer, ya que no hago nada relacionado directamente con él ... y luego aparece cuando abro un controlador modal, por ejemplo, que, posiblemente, "refresca" la aplicación contexto o algo. De todos modos ... para hacer que la barra de estado todavía aparezca, solo cojo el último momento cuando la película termina y hago moviePlayerController.moviePlayer.controlStyle = MPMovieControlStyleFullscreen; – Agat

+0

También tengo que detener el video manualmente [moviePlayerController.moviePlayer stop]; después de cerrar manualmente el controlador de la película, de lo contrario, tendré la pantalla en negro a la izquierda o el sonido de video se reproducirá en segundo plano cuando el controlador ya haya desaparecido. Entonces, el comportamiento bastante "divertido" de iOS. El momento en que capturo el video "finalizará" se describe aquí: http://stackoverflow.com/a/13318267/691660. ¡Buena suerte a todos nosotros!) – Agat

0

No sé si mi solución se aplica a su problema, pero funciona para mi configuración, es decir, ipod de cuarta generación con iOS 5.1.

Mis aplicaciones no muestran la barra de estado en absoluto, y en el archivo info.plist la entrada correspondiente "La barra de estado está inicialmente oculta" se establece en SÍ.

También agregué directamente la vista MPMoviePlayerController a su vista principal. Aquí está el código para configurar el reproductor de películas:

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 es una variable de clase.

Cuando el jugador termina de reproducirse o cuando el usuario pulse el botón "Done" del controlador MoviePlayer, el método playbackFinished: se llama:

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

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

En el que el estilo de control de la MoviePlayer se establece en MPMovieControlStyleNone a evite cualquier control, pero esencialmente la barra de estado se mostrará cuando moviePlayer se elimine de su vista principal.

Cuestiones relacionadas