致謝:ZFPlayer的作者 任子豐
在Cell上播放視頻集绰,需要有一下幾個問題需要解決:
1.劃過屏幕 暫停播放
2.點擊下個 cell 的視頻弃锐,上一個cell的視頻需要暫停
3.在視頻中間有個 播放按鈕
4诅需,每個cell 都要顯示第一幀的image
ZF的使用思路(xib):
1.首先在xib的cell上拖一個imageView养泡,這個imageView用來展示 第一幀的圖片(獲取圖片第一幀看別的筆記),并且在imageView上添加播放按鈕龙宏,記住,imageView要打開用戶交互
2.在播放按鈕點擊事件中,調用block 回調
3.在tableVIew 的 代理方法中重斑,調用回調,在代碼塊中肯骇,給playerView 附上屬性 包括 fatherVIew窥浪,tableVIew,indexPath 等
4笛丙,懶加載 playerVIew漾脂,并且使用單利創(chuàng)建
沒代碼,詳情見 ZF的Demo ........
最新版本 使用方法 :純代碼
1.在cell 上 iamgeIVew 上添加 按鈕胚鸯,點擊按鈕回調
2.在回調 時 tableVIew delegate 里面設置回調 的 三個必須設定值
- 將自己的model 傳給 zf的model
代碼:
第一步:
.h
/** 播放按鈕block */
@property (nonatomic, copy ) void(^playBlock)(UIButton *);
@property (nonatomic , strong) UIImageView * videoImageView;
.m
pragma mark - 視頻播放按鈕點擊
- (void)videoPlayButtonClick:(UIButton *)sender{
NSLog(@"視頻播放按鈕點擊");
if (self.playBlock) {
self.playBlock(sender);
}
}
第二步:
pragma mark - 懶加載
//視頻播放器
- (ZFPlayerView *)playerView {
if (!_playerView) {
_playerView = [ZFPlayerView sharedPlayerView];
_playerView.delegate = self;
// 當cell播放視頻由全屏變?yōu)樾∑習r候骨稿,不回到中間位置
_playerView.cellPlayerOnCenter = NO;
// 當cell劃出屏幕的時候停止播放
_playerView.stopPlayWhileCellNotVisable = YES;
//(可選設置)可以設置視頻的填充模式,默認為(等比例填充姜钳,直到一個維度到達區(qū)域邊界)
// _playerView.playerLayerGravity = ZFPlayerLayerGravityResizeAspect;
// 靜音
// _playerView.mute = YES;
}
return _playerView;
}
pragma mark - TableView 代理 數(shù)據(jù)源
-
(UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath{
RSMomentsTableViewCell * momensfCell = [tableView dequeueReusableCellWithIdentifier:momentsCellIdentifier];
RSMomentsModel * model = _dataSource[indexPath.section];
momensfCell.momentsModel = model;__block NSIndexPath *weakIndexPath = indexPath;
__block RSMomentsTableViewCell *weakCell = momensfCell;
JKWeakSelf// 點擊播放的回調
momensfCell.playBlock = ^(UIButton *btn){ZFPlayerModel *playerModel = [[ZFPlayerModel alloc] init]; playerModel.videoURL = [NSURL URLWithString:model.videoURL]; playerModel.placeholderImageURLString = model.videoURL; playerModel.scrollView = tableView; playerModel.indexPath = weakIndexPath; // player的父視圖tag playerModel.fatherViewTag = weakCell.videoImageView.tag;
// playerModel.fatherView = weakCell.videoImageView;
// 設置播放控制層和model
[weakSelf.playerView playerControlView:nil playerModel:playerModel];
// 下載功能
weakSelf.playerView.hasDownload = NO;
// 自動播放
[weakSelf.playerView autoPlayTheVideo];
};
return momensfCell;
}
第三步:界面消失重置播放器
pragma mark - 頁面消失出現(xiàn)
-
(void)viewWillDisappear:(BOOL)animated {
[super viewWillDisappear:animated];
[self.playerView resetPlayer];
}
注意L构凇!哥桥!
- 如果 出現(xiàn) 有聲音沒有視頻 的情況 說明 你cell 上的控件 加在了cell 上辙浑,應該 加在 cell.contentView上
2.如果放在 cell 上,應該 必須設置他的三個屬性 :
playerModel.scrollView = tableView;
playerModel.indexPath = weakIndexPath;
playerModel.fatherViewTag = weakCell.videoImageView.tag;