前言
前段时间封装了一个视频播放器,由于时间匆忙,还有很多问题以及细节还没有来得及修改,最近挤了一点时间,将播放器完善了一下,具体思路请参考使用AVPlayer自定义支持全屏的播放器(一),本篇文章主要讲解如何在tableView
上面使用。
思路
播放器播放视频肯定会占用内存,如果每一个cell
建立一个播放器,会占用不少的内存,所有全局只建立一个播放器,当播放器所在cell
滑出屏幕,将播放器销毁。
使用代码
当点击cell
时,创建播放器,并且添加到当前cell
上。因为全局只有一个播放器,并且需要在滑动的时候动态计算当前播放器所在cell
的位置,所以使用代理将被点击的cell
传回所在控制器做相应的处理。不需要播放器的时候记得销毁播放器,用以释放内存。
#pragma mark - 点击播放代理
- (void)PlayVideoWithCell:(TableViewCell *)cell;
{
//记录被点击的cell
_cell = cell;
//销毁播放器
[_playerView destroyPlayer];
_playerView = nil;
_playerView = [[CLPlayerView alloc] initWithFrame:CGRectMake(0, 0, cell.width, cell.height)];
[cell.contentView addSubview:_playerView];
//根据旋转自动支持全屏,默认支持
// playerView.autoFullScreen = NO;
//重复播放,默认不播放
// playerView.repeatPlay = YES;
//如果播放器所在页面支持横屏,需要设置为Yes,不支持不需要设置(默认不支持)
// playerView.isLandscape = YES;
//视频地址
_playerView.url = [NSURL URLWithString:cell.model.videoUrl];
//播放
[_playerView playVideo];
//返回按钮点击事件回调
[_playerView backButton:^(UIButton *button) {
NSLog(@"返回按钮被点击");
}];
//播放完成回调
[_playerView endPlay:^{
//销毁播放器
[_playerView destroyPlayer];
_playerView = nil;
NSLog(@"播放完成");
}];
}
在tableView
滑动代理中,需要使用- (void)calculateScrollOffset:(UITableView *)tableView cell:(UITableViewCell *)cell
方法,将tableView
和播放器所在cell
传递给播放器,播放器会在内部计算播放器所在位置,在超出的时候,会将播放器销毁。
/**
根据播放器所在位置计算偏移,添加在TableView上时使用
@param tableView tableView
@param cell 播放器所在cell
*/
- (void)calculateScrollOffset:(UITableView *)tableView cell:(UITableViewCell *)cell;
#pragma mark - 滑动代理
- (void)scrollViewDidScroll:(UIScrollView *)scrollView
{
//计算偏移来销毁播放器
[_playerView calculateScrollOffset:self.tableView cell:_cell];
}
播放器效果图
Demo地址
Demo地址---->CLPlayer 如果喜欢,欢迎star。