前言
前段時(shí)間封裝了一個(gè)視頻播放器,由于時(shí)間匆忙毙驯,還有很多問題以及細(xì)節(jié)還沒有來得及修改拜鹤,最近擠了一點(diǎn)時(shí)間,將播放器完善了一下钧舌,具體思路請(qǐng)參考使用AVPlayer自定義支持全屏的播放器(一)担汤,本篇文章主要講解如何在tableView
上面使用。
思路
播放器播放視頻肯定會(huì)占用內(nèi)存洼冻,如果每一個(gè)cell
建立一個(gè)播放器崭歧,會(huì)占用不少的內(nèi)存,所有全局只建立一個(gè)播放器撞牢,當(dāng)播放器所在cell
滑出屏幕率碾,將播放器銷毀。
使用代碼
當(dāng)點(diǎn)擊cell
時(shí)屋彪,創(chuàng)建播放器所宰,并且添加到當(dāng)前cell
上。因?yàn)槿种挥幸粋€(gè)播放器畜挥,并且需要在滑動(dòng)的時(shí)候動(dòng)態(tài)計(jì)算當(dāng)前播放器所在cell
的位置仔粥,所以使用代理將被點(diǎn)擊的cell
傳回所在控制器做相應(yīng)的處理。不需要播放器的時(shí)候記得銷毀播放器蟹但,用以釋放內(nèi)存躯泰。
#pragma mark - 點(diǎn)擊播放代理
- (void)PlayVideoWithCell:(TableViewCell *)cell;
{
//記錄被點(diǎn)擊的cell
_cell = cell;
//銷毀播放器
[_playerView destroyPlayer];
_playerView = nil;
_playerView = [[CLPlayerView alloc] initWithFrame:CGRectMake(0, 0, cell.width, cell.height)];
[cell.contentView addSubview:_playerView];
//根據(jù)旋轉(zhuǎn)自動(dòng)支持全屏,默認(rèn)支持
// playerView.autoFullScreen = NO;
//重復(fù)播放华糖,默認(rèn)不播放
// playerView.repeatPlay = YES;
//如果播放器所在頁面支持橫屏麦向,需要設(shè)置為Yes,不支持不需要設(shè)置(默認(rèn)不支持)
// playerView.isLandscape = YES;
//視頻地址
_playerView.url = [NSURL URLWithString:cell.model.videoUrl];
//播放
[_playerView playVideo];
//返回按鈕點(diǎn)擊事件回調(diào)
[_playerView backButton:^(UIButton *button) {
NSLog(@"返回按鈕被點(diǎn)擊");
}];
//播放完成回調(diào)
[_playerView endPlay:^{
//銷毀播放器
[_playerView destroyPlayer];
_playerView = nil;
NSLog(@"播放完成");
}];
}
在tableView
滑動(dòng)代理中客叉,需要使用- (void)calculateScrollOffset:(UITableView *)tableView cell:(UITableViewCell *)cell
方法诵竭,將tableView
和播放器所在cell
傳遞給播放器,播放器會(huì)在內(nèi)部計(jì)算播放器所在位置兼搏,在超出的時(shí)候卵慰,會(huì)將播放器銷毀。
/**
根據(jù)播放器所在位置計(jì)算偏移向族,添加在TableView上時(shí)使用
@param tableView tableView
@param cell 播放器所在cell
*/
- (void)calculateScrollOffset:(UITableView *)tableView cell:(UITableViewCell *)cell;
#pragma mark - 滑動(dòng)代理
- (void)scrollViewDidScroll:(UIScrollView *)scrollView
{
//計(jì)算偏移來銷毀播放器
[_playerView calculateScrollOffset:self.tableView cell:_cell];
}
播放器效果圖
Demo地址
Demo地址---->CLPlayer 如果喜歡呵燕,歡迎star棠绘。