2014-04-28 10 views
5

Ich habe eine YTPlayerView innerhalb meiner Unterklasse von UITableViewCell. In meinem UIViewController rufe ich [cell.youtubeView loadWithVideoId:f.videoID]; von meiner Methode TableViewDelagate willDisplayCell. Das Problem ist, dass wenn ich viele Zellen in meinem TableView habe, einige von ihnen weiß bleiben anstatt des YouTube-Inhalts!YTPlayerView innerhalb von UITableViewCell

Youtube API recommends bei der Wiederverwendung der YTPlayerView zum Laden des Inhalts durch den Aufruf [cell.youtubeView cueVideoById:f.videoID startSeconds:0 suggestedQuality:kYTPlaybackQualityHighRes]; stattdessen. Leider lädt diese Methode YouTube-Inhalte überhaupt nicht.

Hat jemand das gleiche Problem? Jede bekannte Lösung?

Ich dachte, zuerst den Inhalt mit loadWithVideoId und dann cueVideoById zu laden, aber das hat nicht funktioniert.

Antwort

2

Ich hatte dieses Problem mit YTPlayerView Instanzen in UIColectionViewCell Instanzen. Letztendlich musste ich das Video in didEndDisplayingCell ([self.playerView stopVideo]) stoppen. Dann in prepareForReuse (oder optional in cellForRowAtIndexPath), nil out Ihre playerView, und in cellForRowAtIndexPath re-init den Player und laden Sie das Video von ID.

2

Ich habe YTPlayerView in UICollectionView (ähnlich wie in Ihrem Fall) verwendet.

In meinem Fall, YTPlayerView wurde schwarz, wenn es in wieder verwendet wurde UICollectionViewCell (ordnungsgemäß auf zuerst initiierte Zelle geladen).

YTPlayerView wurde schwarz, weil -loadWithVideoId:playerVars: zweimal aufgerufen wird, bevor die zuerst aufgerufene Methode abgeschlossen ist.

Ich habe weiß YTPlayerView für nicht geladen Video ist, so empfehle ich die Überprüfung -loadWithVideoId: oder ähnliche Verfahren ordnungsgemäß in irgendwo genannt.

+0

Ich bestätige den schwarzen Fall. – Maq

0

Hier ist eine andere Herangehensweise, Puristen werden es nicht mögen, aber ich konnte nicht herausfinden, wie man die YTPlayerView, die in meiner benutzerdefinierten UICollectionViewCell erstellt wurde, richtig freigibt.

In Anbetracht der Tatsache, dass Sie nur ein Video zur Zeit spielen, weil zwei verschiedene Instanzen von YTPlayer nicht gleichzeitig spielen können, müssen Sie nur verstecken wiederverwendete Zellen mit Video-thumbnail. Einfach gesagt ein UIImageView über dem YTplayerView in Ihrem sublclass von UICollectionViewCell xib, und stellen Sie die Miniaturansicht in ihm:

-(UICollectionViewCell *)collectionView:(UICollectionView *)collectionView cellForItemAtIndexPath:(NSIndexPath *)indexPath { 

    //... load customcell xib, manage cellId etc. 

    // set video id that will be read by the custom cell 
    [cell setVideoId:cellVideoId]; 

    // set above UIImage 
    NSData * thumbnailData = [[NSData alloc] initWithContentsOfURL: [NSURL URLWithString: videoThumbnailURL]]; 
    UIImage * videoThumbnail = [UIImage imageWithData: thumbnailData]; 
    [cell.thumbnailImage setImage:videoThumbnail]; 
    return cell; 
} 

Dort, in benutzerdefinierter UICollectionViewCell .m-Datei müssen Sie nur eine Schaltfläche implementieren, um das Video zu starten, wenn darauf geklickt. ..

- (IBAction)clickPlay:(id)sender { 
    if (videoId != nil){   
     [ccellYTPlayerView loadWithVideoId:videoId playerVars:playerVars]; 

     // Hide thumbnail image to reveal the YTPlayerView 
     [thumbnailImage setHidden:true]; 
    } 
} 

... und Wiederverwertbarkeit dieser benutzerdefinierten Zelle konfigurieren, die einwandfrei für native obvjects funktioniert:

-(void) prepareForReuse{ 
    [super prepareForReuse]; 

    // preparing UIImage to host another thumbnail 
    thumbnailImage.image = nil; 
    [thumbnailImage setHidden:false]; 
} 

diese Weise YTplayers ca n erscheinen in anderen Zellen, niemand wird es sehen, weil durch das Thumbnail versteckt, und der erzeugte Sound ist kein Problem, weil der Benutzer annehmen wird, dass er von der ursprünglichen Zelle kommt (die wegen Scrollen nicht mehr auf dem Bildschirm ist).

Ich weiß, das ist nicht wirklich sauber, aber es hat mir bisher geholfen, YTPlayer Instanz ist nicht so einfach zu recyceln.

1

Swift 3

hatte ich das gleiche Problem. Mein Problem war, dass die Methode load (withVideoId: videoId) mehrfach aufgerufen wurde (wegen der cellForRow beim Scrollen mehrmals aufgerufen).

Ich löste dies durch einen Booleschen erstellen und sicherstellen, dass die Last (withVideoId: videoId) nur einmal aufgerufen wird:

1) In der Zellklasse, eine globale Boolean

var isAlreadyPlaying : Bool = false 
erstellen

2) Wenn Sie Ihr Video abspielen möchten, setzen wir unsere boolean zu vermeiden, ist es mehrmals zu spielen:

func loadVideo() { 

    //Making sure we are not playing the video several time 
    if isAlreadyPlaying == false { 

     //Creating vars (optional) 
     let playerVars = ["playsinline": 1, "autoplay": 1, "autohide": 1, "controls" : 1, "showinfo" : 0, "modestbranding" : 1, "rel" : 0] 

     // Launching the video 
     youtTubeView?.load(withVideoId: videoId, playerVars : playerVars) 

     // Force to not play the video again 
     isAlreadyPlaying = true 
    } 

}