it-swarm.com.de

Vollbild-MPMoviePlayerController in iOS 3.2 (iPad) richtig anzeigen und entfernen

Ich habe große Probleme, einen Fullscreen-Film in meiner iPad-App anzuzeigen und dem Benutzer zu erlauben, ihn entweder über die Schaltfläche "Fertig" oder über die Schaltfläche "Vollbild entfernen" auf den Player-Steuerelementen zu schließen.

Anfangs habe ich MPMoviePlayerViewController für die Filmpräsentation verwendet, aber ich erhielt keine Vollbildbenachrichtigungen zum Öffnen/Beenden von ihrem MPMoviePlayerController-Objekt, also wechselte ich selbst dazu.

Ich kann den Film als Vollbild erscheinen lassen (obwohl der Übergang janky ist), aber wenn entweder die Tasten "Done" oder "Un-Fullscreen" gedrückt werden, führt der Player keine Aktion aus. Ich habe meinen Code hier veröffentlicht:

- (void)startPlayingMovieWithURLString:(NSString *)movieURLString {
    // I get all of these callbacks **EXCEPT** the "willExitFullScreen:" callback.
    [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(willEnterFullScreen:) name:MPMoviePlayerWillEnterFullscreenNotification object:nil];
    [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(willExitFullScreen:) name:MPMoviePlayerWillExitFullscreenNotification object:nil];
    [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(didFinishPlayback:) name:MPMoviePlayerPlaybackDidFinishNotification object:nil];

    [self.moviePlayerController setContentURL:someExistingURL];

        // "self" is a UIViewController subclass, and is presented as a "fullscreen" modal view controller from its parent
        // I'm setting the movie player's view's frame to take up the full rectangle of my view controller, but really I want the movie to be completely removed when the user presses "done" (that is, removed from the view hierarchy). Not sure when/where to do this.
    self.moviePlayerController.view.frame = self.view.frame;
    [self.view addSubview:self.moviePlayerController.view];
    [self.moviePlayerController setFullscreen:YES animated:YES];

}

Und hier ist der Code für meinen didFinish-Callback

- (void)didFinishPlayback:(NSNotification *)notification {
        // This ends up recursively telling the player that playback ended, thus calling this method, thus…well you get the picture.
        // What I'm trying to do here is just make the player go away and show my old UI again.
    [self.moviePlayerController setFullscreen:NO animated:YES];
}

Natürlich mache ich etwas falsch, aber ich habe die Dokumentation durch und durch und ich kann nicht herausfinden, wie der Film einfach weggeht. Ich dachte, es wäre intuitiver als dies. Was mache ich falsch?

22
jbrennan

So funktionieren die Ereignisse -> Benachrichtigungen:

  • Benutzer drückt 'Fertig'  

    • MPMoviePlayerWillExitFullscreenNotification
    • MPMoviePlayerDidExitFullscreenNotification
  • Benutzer drückt die Taste 'Vollbild verlassen' beim Transport

    • MPMoviePlayerWillExitFullscreenNotification
    • MPMoviePlayerDidExitFullscreenNotification
    • Beachten Sie, dass die Wiedergabe nicht stoppt
  • Film erreicht Ende

    • MPMoviePlayerPlaybackDidFinishNotification mit MPMoviePlayerPlaybackDidFinishReasonUserInfoKey auf MPMovieFinishReasonPlaybackEnded gesetzt
    • Wenn Sie mit dieser Benachrichtigung setFullscreen:NO animated:YES in Ihrer MoviePlayerController-Instanz aufrufen, erhalten Sie die Benachrichtigungen WillExit und DidExit.
    • Beachten Sie, dass Sie keine PlaybackDidFinish-Benachrichtigung erhalten, wenn der Benutzer auf die Schaltfläche Fertig oder Vollbild verlassen klickt.

Wenn Sie die MoviePlayer-Ansicht entfernen möchten, müssen Sie normalerweise [self.moviePlayerController.view removeFromSuperview] im Benachrichtigungs-Handler DidExitFullscreen angeben. WillExitFullscreen ist zu früh.

Hier ist mein Code:

- (void)willEnterFullscreen:(NSNotification*)notification {
    NSLog(@"willEnterFullscreen");
}

- (void)enteredFullscreen:(NSNotification*)notification {
    NSLog(@"enteredFullscreen");
}

- (void)willExitFullscreen:(NSNotification*)notification {
    NSLog(@"willExitFullscreen");
}

- (void)exitedFullscreen:(NSNotification*)notification {
    NSLog(@"exitedFullscreen");
    [self.movieController.view removeFromSuperview];
    self.movieController = nil;
    [[NSNotificationCenter defaultCenter] removeObserver:self];
}

- (void)playbackFinished:(NSNotification*)notification {
    NSNumber* reason = [[notification userInfo] objectForKey:MPMoviePlayerPlaybackDidFinishReasonUserInfoKey];
    switch ([reason intValue]) {
        case MPMovieFinishReasonPlaybackEnded:
            NSLog(@"playbackFinished. Reason: Playback Ended");         
                break;
        case MPMovieFinishReasonPlaybackError:
            NSLog(@"playbackFinished. Reason: Playback Error");
                break;
        case MPMovieFinishReasonUserExited:
            NSLog(@"playbackFinished. Reason: User Exited");
                break;
        default:
            break;
    }
    [self.movieController setFullscreen:NO animated:YES];
}

- (void)showMovie {
    [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(willEnterFullscreen:) name:MPMoviePlayerWillEnterFullscreenNotification object:nil];
    [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(willExitFullscreen:) name:MPMoviePlayerWillExitFullscreenNotification object:nil];
    [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(enteredFullscreen:) name:MPMoviePlayerDidEnterFullscreenNotification object:nil];
    [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(exitedFullscreen:) name:MPMoviePlayerDidExitFullscreenNotification object:nil];
    [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(playbackFinished:) name:MPMoviePlayerPlaybackDidFinishNotification object:nil];

    NSURL* movieURL =  [NSURL fileURLWithPath:[[NSBundle mainBundle] pathForResource:@"tron" ofType:@"mov"]];
    self.movieController = [[MPMoviePlayerController alloc] initWithContentURL:movieURL];
    self.movieController.view.frame = self.view.frame;
    [self.view addSubview:movieController.view];
    [self.movieController setFullscreen:YES animated:YES];
    [self.movieController play];
}
66
Art Gillespie

Ja. Das ist großartig. Es gibt wirklich Benachrichtigungen, die oben erwähnt wurden ...

Es gibt jedoch keine MPMoviePlayerPlaybackWillFinishNotification !!! Das ist wirklich ein Problem.

Wenn Sie den Movie-Player als modal aufrufen (unabhängig davon, welche der folgenden Methoden presentViewController/presentModalViewController/presentVideoController verwendet), wenn Sie .fullScreen = YES definiert haben, wird nicht erwartet, dass Sie MPMoviePlayerWillExitFullscreenNotification notification at all ( Offensichtlich, weil es nicht darauf ankommt, dass wir den gesamten Bildschirm betreten/verlassen, sondern nur den Controller präsentieren/abweisen.

Es gibt jedoch wirklich keine Benachrichtigungen, dass das Video kurz vor dem Abschluss steht und geschlossen wird. Dies ist (neben anderen möglichen Situationen) erforderlich, um den Moment abzufangen, an dem der Übergang der Entlassung beginnt. (Der Übergang beginnt natürlich vor dem Aufruf von MPMoviePlayerPlaybackDidFinishNotification ). Zur gleichen Zeit wird application: supportedInterfaceOrientationsForWindow: für den zuvor angezeigten Controller vor der Benachrichtigung aufgerufen, und es gibt keine Möglichkeit der AppDelegate zu sagen, dass unser aktueller Controller bereits in einer anderen Ausrichtung angezeigt werden muss.

Da mein Video also Vollbild ist und auch keine Bedienelemente angezeigt werden (dies ist eine Art Intro, also erst, wenn es fertig ist) Meine Lösung bestand nur darin, einen Timer zu haben, der jeden kurzen Tick (0,1 Sekunden) überprüft, was das ist Video aktuelle Position ... und es ist fast am Ende, dann ist dies der Moment für meine eigene Benachrichtigung.

0
Agat