2010-10-18 6 views
20

Übernehmen Sie iOS 3.2 oder höher. Was ist die richtige Befehlsfolge, um einen Zug mit den anfangs verborgenen Steuerelementen zu spielen? Wenn der Film abgespielt wird, hat der Benutzer die Möglichkeit, auf dem Bildschirm zu markieren und Steuerelemente anzuzeigen.Wie kann die Steuerung ausgeblendet werden, bevor der MPMoviePlayerController-Film abgespielt wird?

Danke!

Meine (Kontrolle nicht versteckt) Code:

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

Antwort

35

[Update] Wie @ReinYem vorgeschlagen, eine viel bessere Lösung ist auf einem MPMoviePlayerLoadStateDidChangeNotification anstelle eines Timers zu verlassen.

Set controlStyle Eigenschaft auf MPMovieControlStyleNone zunächst, und setzt es dann zu MPMovieControlStyleFullscreen einer Sekunde später ein [performSelector:withObject:afterDelay:1] mit:

Eigentlich ist die folgende Lösung soll nicht mehr in Betracht gezogen werden. Es funktioniert gut, Kontrollen erscheinen nicht, bis der Benutzer auf Video tippt.

+1

Schöner Tipp. Ich habe auch festgestellt, dass, wenn ich den Steuerungsstil direkt nach Aufruf von play auf "MPMovieControlStyleFullscreen" setze, das gleiche Ergebnis erzielt. Vielleicht gibt es keinen Grund, eine willkürliche Verzögerung von einer Sekunde anzugeben? – curthipster

+0

Eine Sekunde Verzögerung funktionierte auch für mich. Ich habe es eine halbe Sekunde versucht, aber das war zu schnell. –

+0

Ja, ich brauche auch eine Verzögerung und frage mich immer noch, warum ich eine solche Verzögerung einführen muss. –

34

Verwenden Sie einen Rückruf anstelle eines Timers:

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

mit Rückruf-Funktion:

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

} 
+0

Ich mag diese Lösung wirklich, da sie das gewünschte Verhalten weitaus genauer abdeckt als ein Timer und die Bedingung "Play-but-then-pause-or-hide" vollständig entfernt (vorausgesetzt, Sie reinigen diesen Beobachter auch in diesen Fällen). –

+0

Nicht nur ist dies die "bessere" Lösung, es ist die richtige Lösung. Der andere scheitert einfach an unvorhersehbaren Rennbedingungen. – kevlar

+3

Nicht sicher, dass dies immer noch auf iOS 6 funktioniert. Es scheint zufällig zu sein, ob sich der loadState zu früh ändert. Das Beobachten von MPMoviePlayerPlaybackStateDidChangeNotification für eine Änderung von playbackState zu MPMoviePlaybackStatePlaying scheint robuster zu sein. –

10
player.moviePlayer.controlStyle = MPMovieControlStyleNone; 

ist die neueste Art und Weise, es zu tun. :)

+0

funktioniert wie ein Charme – Hammer

Verwandte Themen