MPMoviePlayerViewController mit embedded video innerhalb von UITabBarController

Ich werde versuchen, ein eingebettetes video-Wiedergabe nicht ordnungsgemäß implementiert innerhalb einer tab-bar-navigation. In meinem speziellen Fall das video dargestellt werden soll, in einem nicht-Vollbild-Weise auf einer UIView, die mit gehostet wird, die von einem UIViewController, verwaltet von einem UITabBarController.

Zur Vereinfachung der Beispiel, können sagen, ich habe zwei Tabletten in meiner tabbar. Zuerst zeigt man einige random stuff, die zweite zeigt die viewcontroller, dass die Gastgeber das eingebettete video.

Sobald der Benutzer wählt den zweiten Reiter, das video laden und Abspielen einwandfrei.

Zum initialisieren der player verwende ich den folgenden code von meinem UIView abgeleiteten Klasse, ausgelöst durch den Initialisierer (initWithFrame):

- (void)initPlayback
{
     self.movieViewController = [[MPMoviePlayerViewController alloc] init];
     movieViewController_.wantsFullScreenLayout = NO;
     movieViewController_.moviePlayer.controlStyle = MPMovieControlStyleEmbedded;
     [self addSubview:self.movieViewController.view];
}

Für die Wiedergabe starten, ich bin mit dem folgenden code, ausgelöst durch die Methode viewWillAppear meiner UIViewController abgeleitete Klasse:

- (void)playVideo
{
     [movieViewController_.moviePlayer setContentURL:fileURL_];
}

Wenn dann der Benutzer wählt den ersten tab (während das video noch abgespielt wird), mache ich sicher, dass das video gestoppt, als würde es weiter spielen, wenn das nicht getan wurde:

- (void)stopVideo
{
     [movieViewController_.moviePlayer stop];
}

Sobald der Benutzer wählt den zweiten Reiter wieder, die Ansicht bleibt leer, nichts wird geladen oder abgespielt wird, obwohl die playVideo-Methode aufgerufen.

Was bin ich, warum ist die video-Wiedergabe zu Versagen, wenn zulassen, indem Sie die zweite Registerkarte?

==========neuer Versuch=============

Dieser Zeit habe ich aufgehört, sich auf shouldAutoplay (wie vorgeschlagen) aber, dass nicht einen Unterschied machen.

Angepasst und Hinzugefügt code, für diese;

- (void)MPMoviePlayerLoadStateDidChange:(NSNotification *)notification
{
    if (movieViewController_.moviePlayer.loadState == MPMovieLoadStatePlayable &&
        movieViewController_.moviePlayer.playbackState != MPMoviePlaybackStatePlaying)
    {
        [movieViewController_.moviePlayer play];
    }
}

- (void)deregisterFromNotifications
{
    [[NSNotificationCenter defaultCenter] removeObserver:self 
                                                    name:MPMoviePlayerLoadStateDidChangeNotification 
                                                  object:nil];

}


- (void)registerForNotifications
{
    [[NSNotificationCenter defaultCenter] addObserver:self 
                                             selector:@selector(MPMoviePlayerLoadStateDidChange:) 
                                                 name:MPMoviePlayerLoadStateDidChangeNotification 
                                               object:nil];
}

- (void)initPlayback
{
    NSLog(@"playback init...");
    self.movieViewController = [[MPMoviePlayerViewController alloc] init];
    movieViewController_.wantsFullScreenLayout = NO;
    movieViewController_.moviePlayer.shouldAutoplay = NO;
    movieViewController_.moviePlayer.controlStyle = MPMovieControlStyleEmbedded;
    movieViewController_.moviePlayer.currentPlaybackTime = 0.0f;
    [self addSubview:movieViewController_.view];
}

- (void)playVideo
{
    NSLog(@"playback starting...");
    [self registerForNotifications];
    [movieViewController_.moviePlayer setContentURL:fileURL_];
}

- (void)stopVideo
{
    NSLog(@"playback stopping...");
    [movieViewController_.moviePlayer stop];
    [self deregisterFromNotifications];
}
  • omg, die Antwort war so einfach, ich bin zu zögern, es zu schreiben, als eine Antwort.... durch hinzufügen von [movieViewController_.moviePlayer prepareToPlay] zu meinem playVideo Methode, Dinge begonnen, funktioniert gut und wie erwartet. Macht keinen Sinn für mich, aber es funktioniert.
  • Herzlichen Glückwunsch! Yay! Es war mir unklar, dass Sie das spielen über das Netzwerk. MPMovieLoadStatePlayable als loadstate bedeutet, dass Sie heruntergeladen haben genug von dem Film, so dass das Telefon ist bequem, es zu spielen.
InformationsquelleAutor Till | 2011-02-19
Schreibe einen Kommentar