我在UITableViewCell的子类中有一个YTPlayerView。在我的UIViewController中,我从tableViewDelagate [cell.youtubeView loadWithVideoId:f.videoID];
方法中调用willDisplayCell
。问题是,当我的表格中有很多单元格时,其中一些单元格保持白色而不是YouTube内容!
Youtube API recommends
而是[cell.youtubeView cueVideoById:f.videoID startSeconds:0 suggestedQuality:kYTPlaybackQualityHighRes];
。不幸的是,这种方法根本无法加载YouTube内容。
有人遇到同样的问题吗?任何已知的解决方案?
我想第一次将内容加载到loadWithVideoId
然后加载cueVideoById
,但这不起作用。
答案 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实例并不那么容易回收。