2011-12-02 7 views
6

Ho un oggetto MPMoviePlayerController che riproduce un video a schermo intero in verticale o orizzontale. Se ruoto l'orientamento mentre il video è in riproduzione e faccio la rotazione entro pochi secondi dopo l'inizio della riproduzione del video e la barra di stato del video è visibile, quando il video termina la mia barra di navigazione è perfetta. Ma se aspetto che la barra di stato del video scompaia alcuni secondi nella riproduzione del video e quindi ruoti l'orientamento, quando il video termina il mio navigationBar è parzialmente nascosto dietro la barra di stato, come spinto verso l'alto.Comportamento estremamente strano della navigazioneBar e MPMoviePlayerController. Bug in iOS o il mio errore?

Hai mai visto qualcosa del genere?

Sono in grado di ricreare facilmente questo errore. Ho creato una nuova app Single View e ho semplicemente aggiunto un pulsante e una barra di navigazione. Se ruoto l'orientamento mentre il video è in riproduzione, tocca per attivare la modalità a schermo intero e la barra di stato del video è ancora visibile, quando il video termina, tutto va bene. Ma, se aspetto di ruotare dopo che la barra di stato del video scompare, quando ruoto e il video finisce, la barra di navigazione è sotto la barra di stato. Vedi immagine:

iPhone Image

Ecco il semplice codice che sto usando:

- (void) playMovie { 
NSURL *url = [NSURL fileURLWithPath:[[NSBundle mainBundle] pathForResource: @"movie" ofType: @"mov"]]; 
moviePlayer = [[MPMoviePlayerController alloc] initWithContentURL: url]; 

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

moviePlayer.controlStyle = MPMovieControlStyleDefault; 
moviePlayer.shouldAutoplay = YES; 

[self.view addSubview: moviePlayer.view]; 
[moviePlayer setFullscreen: YES animated: YES]; 

- (void) moviePlayBackDidFinish: (NSNotification *) notification 
    MPMoviePlayerController *player = [notification object]; 
[[NSNotificationCenter defaultCenter] removeObserver: self 
               name: MPMoviePlayerPlaybackDidFinishNotification 
               object: player]; 

if ([player respondsToSelector: @selector(setFullscreen:animated:)]) 
{ 
    [player.view removeFromSuperview]; 
} 

Ecco dove mi trovo attualmente con i suggerimenti dati qui di seguito. Devo avere qualcosa di sbagliato perché sfortunatamente ho ancora lo stesso problema.

Ecco il metodo onPlayerWillExitFullScreen

UIView *view = [[[UIApplication sharedApplication] delegate].window.subviews lastObject];  
if (view) { 
    [view removeFromSuperview]; 
    [[[UIApplication sharedApplication] delegate].window addSubview:view]; 
} 

MPMoviePlayerController *player = [aNotification object]; 
[[NSNotificationCenter defaultCenter] removeObserver: self 
               name: MPMoviePlayerWillExitFullscreenNotification 
               object: player];  

e qui è la mia attuale playMovie metodo:

NSURL *url = [NSURL fileURLWithPath:[[NSBundle mainBundle] pathForResource: @"movie" ofType: @"mov"]]; 
moviePlayer = [[MPMoviePlayerController alloc] initWithContentURL: url]; 

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

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

moviePlayer.controlStyle = MPMovieControlStyleDefault; 
moviePlayer.shouldAutoplay = YES; 

[self.view addSubview: moviePlayer.view]; 
[moviePlayer setFullscreen: YES animated: YES]; 
+0

È possibile includere uno o due screenshot. –

+0

Grazie Jeff per il suggerimento. –

+0

Il tuo link allo screenshot è rotto. – JonasCz

risposta

5

Ok, quindi ho trovato questo impazzendo stesso bug tutta la mia app primo di un'UIWebView poi in un MPMoviePlayerController, ho risolto questo piazzamento questo codice nel mio controller della vista.

- (void)willRotateToInterfaceOrientation:(UIInterfaceOrientation)toInterfaceOrientation duration:(NSTimeInterval)duration { 
    [self.navigationController setNavigationBarHidden:YES animated:YES]; 
    [self.navigationController setNavigationBarHidden:NO animated:YES]; 
} 

Ingannevoli bug, soluzioni complicate.

+0

Infine !! Grazie mille. Ho dovuto giocare un po 'ma ho capito Ho inserito il codice all'interno del mio - (void) movieFinished: (NSNotification *) aNotification –

+0

Grazie man, finalmente !! –

+0

bel trucco, ha funzionato per me su iOS 5.0 – rakeshNS

5

Se si ascolta per la notifica MPMoviePlayerWillExitFullscreenNotification, è possibile forzare le vostre opinioni principali per ridisegnare correttamente come segue . La 'finestra' a cui si fa riferimento è l'oggetto UIWindow principale dell'applicazione.

Quando MPMoviePlayerController è passato a schermo intero, in realtà crea un'istanza UIWindow separata per presentare il video. Ricevendo la notifica mentre ritorna indietro, questo codice garantirà il corretto riallineamento delle viste che si stanno ripristinando.

Certo, questa non è una soluzione elegante, ma funziona sempre.

UIView *view = [window.subviews lastObject]; 
if (view) { 
    [view removeFromSuperview]; 
    [window addSubview:view]; 
} 

per ascoltare questa notifica, è necessario fare qualcosa di simile, dove self.playerController è l'oggetto MPMoviePlayerController.

Ricordarsi di interrompere l'ascolto di questa notifica una volta rilasciato il lettore!

// Determine the default notification centre 
    NSNotificationCenter *centre = [NSNotificationCenter defaultCenter]; 
    // Listen for interesting movie player notifications 
    [centre addObserver: self 
       selector: @selector(onPlayerWillExitFullScreen:) 
        name: MPMoviePlayerWillExitFullscreenNotification 
       object: self.playerController]; 
+0

Grazie per l'aiuto. Sono nuovo alla programmazione quindi non sono molto sicuro di come implementare quella notifica, ma ho intenzione di dargli una possibilità. Sono super sollevato di sapere che c'è una soluzione. –

+0

Aggiornato la mia risposta per includere questo per voi. – reddersky

+0

Sono confuso sull'oggetto UIWindow. Prendi la mia semplice applicazione di prova, tutto quello che ho è una app Single View con solo un pulsante e una barra di navigazione. Ho provato a sub "finestra" con "self.view", ma non deve essere corretto. –

3
- (void) moviePlayerWillExitFullScreen:(id)sender { 

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

} 

Ragazzi provate questo ... Funziona per me.Ho provato molti altri modi e solo questo ha funzionato.

Problemi correlati