2010-10-18 12 views
20

Presuppone iOS 3.2 o successivo. Qual è la sequenza corretta di comando per eseguire una mossa con i controlli inizialmente nascosti. Durante la riproduzione del film, l'utente ha la possibilità di taggare sullo schermo e mostrare i controlli.Come nascondere il controllo prima che venga riprodotto il film MPMoviePlayerController?

Grazie!

mio (il controllo non nascosto) Codice:

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

    // Register to receive a notification when the movie has finished playing. 
    [[NSNotificationCenter defaultCenter] addObserver:self 
              selector:@selector(movieDone:) 
               name:MPMoviePlayerPlaybackDidFinishNotification 
               object:moviePlayer]; 

    [[NSNotificationCenter defaultCenter] addObserver:self 
              selector:@selector(movieState:) 
               name:MPMoviePlayerNowPlayingMovieDidChangeNotification 
               object:moviePlayer]; 

    [[NSNotificationCenter defaultCenter] addObserver:self 
              selector:@selector(movieReady:) 
               name:MPMoviePlayerLoadStateDidChangeNotification 
               object:nil]; 

    [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(willEnterFullScreen:) name:MPMoviePlayerWillEnterFullscreenNotification object:moviePlayer]; 
    [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(willExitFullScreen:) name:MPMoviePlayerWillExitFullscreenNotification object:moviePlayer]; 
    [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(didFinishPlayback:) name:MPMoviePlayerPlaybackDidFinishNotification object:moviePlayer]; 


    if ([moviePlayer respondsToSelector:@selector(setFullscreen:animated:)]) { 
     moviePlayer.controlStyle = MPMovieControlStyleDefault; // MPMovieControlStyleNone MPMovieControlStyleEmbedded MPMovieControlStyleFullscreen MPMovieControlStyleDefault 
     moviePlayer.scalingMode = MPMovieScalingModeAspectFill; // MPMovieScalingModeAspectFit MPMovieScalingModeAspectFill 
    } 
} 

- (void) movieReady:(NSNotification*)notification 
{ 
    MPMoviePlayerController *moviePlayer = [notification object]; 

    if ([moviePlayer loadState] != MPMovieLoadStateUnknown) { 
     // Remove observer 
     [[NSNotificationCenter defaultCenter] removeObserver:self 
                 name:MPMoviePlayerLoadStateDidChangeNotification 
                 object:nil]; 

     // When tapping movie, status bar will appear, it shows up 
     // in portrait mode by default. Set orientation to landscape 
     [[UIApplication sharedApplication] setStatusBarOrientation:UIInterfaceOrientationLandscapeLeft animated:NO]; 
     [[UIApplication sharedApplication] setStatusBarHidden:YES withAnimation:UIStatusBarAnimationNone]; 

     // Add movie player as subview 
     [[self view] addSubview:[moviePlayer view]]; 

     // Play the movie 
     [moviePlayer play]; 
     [moviePlayer setFullscreen:YES animated:YES];  
    } 
} 

risposta

35

[Update] Come proposto dalla @ReinYem, una soluzione molto migliore è quella di affidarsi ad un MPMoviePlayerLoadStateDidChangeNotification invece di un timer.

In realtà, la seguente soluzione non dovrebbe essere considerato più:

Impostare controlStyle proprietà MPMovieControlStyleNone inizialmente, e poi impostarlo MPMovieControlStyleFullscreen un secondo dopo con un [performSelector:withObject:afterDelay:1]. Funziona bene, i controlli non appaiono finché l'utente non tocca il video.

+1

Un buon consiglio. Ho anche scoperto che impostando lo stile di controllo su 'MPMovieControlStyleFullscreen' immediatamente dopo aver chiamato play, si ottiene lo stesso risultato. Quindi forse non c'è motivo di specificare un ritardo arbitrario di 1 secondo? – curthipster

+0

Un ritardo di un secondo ha funzionato anche per me. Ho provato mezzo secondo, ma era troppo veloce. –

+0

Sì, anch'io ho bisogno di un ritardo ancora chiedendo perché ho bisogno di introdurre tale ritardo. –

34

Utilizzare un callback, invece di un timer:

[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(hidecontrol) 
               name:MPMoviePlayerLoadStateDidChangeNotification 
               object:playerView.moviePlayer]; 

Con la funzione di richiamata:

- (void) hidecontrol { 
[[NSNotificationCenter defaultCenter] removeObserver:self  name:MPMoviePlayerNowPlayingMovieDidChangeNotification object:playerView.moviePlayer]; 
[playerView.moviePlayer setControlStyle:MPMovieControlStyleFullscreen]; 

} 
+0

Mi piace molto questa soluzione, poiché copre il comportamento desiderato in modo molto più preciso di un timer, rimuovendo completamente la condizione di gara play-but-then-pause-or-hide (supponendo che pulisci questo osservatore anche in questi casi). –

+0

Non solo questa è la soluzione "migliore", è la soluzione corretta. L'altro semplicemente fallisce di fronte a condizioni di gara imprevedibili. – kevlar

+3

Non sono sicuro che funzioni ancora su iOS 6. Sembra essere casuale se lo stato di loadState cambi troppo presto. Osservazione di MPMoviePlayerPlaybackStateDidChangeNotification per una modifica in playbackState in MPMoviePlaybackStatePlaying sembra più robusto. –

10
player.moviePlayer.controlStyle = MPMovieControlStyleNone; 

è il nuovo modo per farlo. :)

+0

funziona come un fascino – Hammer

Problemi correlati