2011-08-24 16 views
9

Tengo un pequeño problema interesante con mi aplicación de iPhone. Tengo una vista con una tabla y cada celda, cuando hace clic, reproduce un video de pantalla completa y luego cuando presiona listo, el video se detiene y vuelve a la vista de tabla. El único problema es que cuando presiona dentro de los primeros 2 o 3 segundos de la carga de video, cuando la vista vuelve a la vista de tabla, la barra en la parte superior de la pantalla que indica el tiempo y la carga de la batería, etc., ya no está allí, es solo un espacio en blanco. Pero si presiona listo después de los primeros segundos, cuando vuelve a la vista de tabla, ¡todo está absolutamente bien! No tengo absolutamente ninguna idea de por qué esto está ocurriendo y lo único que he encontrado en Internet es esto lo que es un tipo con casi exactamente el mismo problema que yo:Desaparece la barra de estado en la parte superior después de cerrar MPMoviePlayerController

http://www.iphonedevsdk.com/forum/iphone-sdk-development/53020-disappearing-status-bar.html

Esto me lleva a tratar de usar:

[UIApplication sharedApplication].statusBarHidden = NO; 

Sin embargo, esto no conduce a ninguna parte tampoco.

El código que se ejecuta al hacer clic en un vídeo:

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

Y el código que se ejecuta ya sea cuando el vídeo se lleva a cabo o cuando el usuario hace clic hecho es:

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; 

Si cualquiera puede arrojar algo de luz sobre esta situación, estaría muy agradecido ya que es extremadamente frustrante.

Gracias,

Matt

Respuesta

6

Tal vez la animación de vídeo cuando la vista desaparece está causando un problema de sincronización con la animación barra de estado.

intente retrasar el statusBarHidden = NO llamar por unos segundos.

NSInteger delay = 3; 

dispatch_after(dispatch_time(DISPATCH_TIME_NOW, delay * NSEC_PER_SEC), dispatch_get_current_queue(), ^{ 
[UIApplication sharedApplication].statusBarHidden = NO; 
}); 
+0

Gracias, esto funciona, pero el tiempo más corto que parece retrasar con éxito es de 1 segundo, que es un poco demasiado largo. Si es la única forma en que puedo arreglarlo, entonces lo hará, pero preferiblemente solo aparecerá tan pronto como se cargue la vista, en lugar de 1 segundo después –

6

En su lugar, puede configurar el retraso para que sea un flotador. Entonces sería

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

Tuve el mismo problema y lo solucioné modificando un poco el código de richerd. 0.1 segundo es aceptable imo. También tuve que cambiar el estilo de la barra de estado ya que devolvía un estilo de barra BlackTranslucent y el original era el estilo BlackOpaque. Pero funciona bien ahora.

3

He encontrado que con las soluciones dadas el contenido a menudo desaparece debajo de la barra de estado. Este enfoque lo soluciona.

Registro de MPMoviePlayerWillExitFullscreenNotification

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

Y luego restablecer la visibilidad barra de estado y quitar y volver a agregar el RootViewController desde la ventana principal, esto se asegurará de que los bordes de la vista son correctos de nuevo.

- (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; 
} 
Cuestiones relacionadas