6

UITableViewCell のサブクラス内に YTPlayerView があります。UIViewController では[cell.youtubeView loadWithVideoId:f.videoID];、tableViewDelagatewillDisplayCellメソッドから呼び出します。問題は、tableView に多くのセルがある場合、YouTube コンテンツではなく一部のセルが白のままになることです!

Youtube API では、YTPlayerView を再利用して、 [cell.youtubeView cueVideoById:f.videoID startSeconds:0 suggestedQuality:kYTPlaybackQualityHighRes];代わりに呼び出してコンテンツを読み込むことを推奨しています。残念ながら、この方法では YouTube コンテンツはまったく読み込まれません。

誰も同じ問題に遭遇しましたか? 既知の解決策はありますか?

最初にコンテンツをロードしてからロードすることを考えていましloadWithVideoIdcueVideoByIdが、うまくいきませんでした。

4

4 に答える 4

2

UICollectionView で YTPlayerView を使用しました(あなたの場合と同様)。

私の場合、再利用されたUICollectionViewCell (最初に開始されたセルに適切にロード) で YTPlayerViewを描画すると、YTPlayerView が黒くなりました。

YTPlayerView が黒くなったのは-loadWithVideoId:playerVars:、最初に呼び出されたメソッドが完了する前に が 2 回呼び出されたためです。

白いYTPlayerViewが読み込まれていないビデオであることを確認したので-loadWithVideoId:、どこかで適切に呼び出されるか、同様のメソッドを確認することをお勧めします。

于 2015-09-24T22:57:50.243 に答える
0

ここに別のアプローチがあります。純粋主義者はそれを好まないでしょうが、カスタム UICollectionViewCell で作成された YTPlayerView を適切に解放/再初期化する方法を見つけることができませんでした。

YTPlayer の 2 つの複数のインスタンスが同時に再生されないため、一度に 1 つのビデオのみを再生することを考慮すると、再利用されたセルをビデオのサムネイルで非表示にするだけです。UICollectionViewCell xib のサブクラスの YTplayerView の上に UIImageView を配置し、その中にサムネイルを設定します。

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

そこに、カスタム UICollectionViewCell .m ファイルで、クリックしたときにビデオを起動するボタンを実装するだけです...

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

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

...そして、このカスタムセルの再利用性を構成します。これは、ネイティブオブジェクトに対して問題なく機能します:

-(void) prepareForReuse{
    [super prepareForReuse];

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

このようにして、YTプレーヤーは他のセルに表示できます。サムネイルで隠されているため、誰も見ることはありません。また、生成された音は、ユーザーが元のセルからのものであると想定するため、問題ではありません(スクロールのために画面に表示されなくなりました)。 )。

私はそれが本当にきれいではないことを知っていますが、これまでのところ役に立ちました.YTPlayerインスタンスはリサイクルが簡単ではありません.

于 2016-11-08T05:34:08.317 に答える