UITableViewCell里面的YTPlayerView

时间:2014-04-28 15:50:12

标签: ios uitableview youtube youtube-api ytplayerview

我在UITableViewCell的子类中有一个YTPlayerView。在我的UIViewController中,我从tableViewDelagate [cell.youtubeView loadWithVideoId:f.videoID];方法中调用willDisplayCell。问题是,当我的表格中有很多单元格时,其中一些单元格保持白色而不是YouTube内容!

重复使用YTPlayerView通过调用加载内容时

Youtube API recommends 而是[cell.youtubeView cueVideoById:f.videoID startSeconds:0 suggestedQuality:kYTPlaybackQualityHighRes];。不幸的是,这种方法根本无法加载YouTube内容。

有人遇到同样的问题吗?任何已知的解决方案?

我想第一次将内容加载到loadWithVideoId然后加载cueVideoById,但这不起作用。

3 个答案:

答案 0 :(得分:2)

我在UICollectionView中使用了YTPlayerView(与你的情况类似)。

在我的情况下,YTPlayerView在重用 UICollectionViewCell中绘制时变黑(在首次启动的单元格上正确加载)。

YTPlayerView变黑是因为-loadWithVideoId:playerVars:在第一次调用的方法完成之前被调用了两次。

我检查了 白色 YTPlayerView用于未加载的视频,因此我建议在某处检查-loadWithVideoId:或类似方法。

答案 1 :(得分:1)

Swift 3

我有同样的问题。我的问题是多次调用方法 load(withVideoId:videoId)(因为在滚动时多次调用了cellForRow)。

我通过创建一个布尔值并确保只调用 load(withVideoId:videoId)来解决这个问题:

1)在单元格类中,创建一个全局布尔值

var isAlreadyPlaying : Bool = false

2)当您想要播放视频时,我们设置布尔值以避免多次播放:

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
    }

}

答案 2 :(得分:0)

这是另一种方法,纯粹主义者不喜欢它,但我无法找到如何正确地释放/重新初始化在我的自定义UICollectionViewCell中创建的YTPlayerView。

考虑到你只会播放一个视频,因为YTPlayer的两个实例不能同时播放,你只需要隐藏重复使用的视频缩略图。只需在UICollectionViewCell xib的子类中将UIImageView放在YTplayerView上方,并在其中设置缩略图:

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

这样,YTplayers可以出现在其他单元格中,没有人会看到它,因为缩略图隐藏了,并且产生的声音不是问题,因为用户会认为它来自原始单元格(不再在屏幕上)因为滚动)。

我知道这不是很干净,但到目前为止它帮助了我,YTPlayer实例并不那么容易回收。