前言
ZFPlayer demo中已經(jīng)列出各種場景的使用,由于公司項目類似于微博,不只是有視頻的展示,tableview由多種復(fù)雜cell組成,為了完美適配,所以更改了部分源代碼
ZFPlayer地址
正文
1. 初始化播放器,設(shè)置屬性,回調(diào)等
ZFPlayerController初始化要給定對應(yīng)的View的tag,這個View一般是UIIMageView用來在cell中展示封面的,ZFPlayer內(nèi)部完全是根據(jù)tag查找View來進行設(shè)置播放視圖的
ZFAVPlayerManager *playerManager = [[ZFAVPlayerManager alloc] init];
self.player = [ZFPlayerController playerWithScrollView:self.storyTableView playerManager:playerManager containerViewTag:999];
self.player.controlView = self.controlView;
此處的controlView即ZFPlayerControlView,它有兩個關(guān)鍵子視圖ZFPortraitControlView和ZFLandScapeControlView,分別是豎屏全屏和橫屏全屏的播放視圖
ZFPlayerController可以設(shè)置很多屬性,可以選擇移動網(wǎng)絡(luò)是否自動播放,也可以直接控制是否自動播放
// 移動網(wǎng)絡(luò)依然自動播放(默認(rèn)NO)
self.player.WWANAutoPlay = NO;
//自動播放
self.player.shouldAutoPlay = NO;
播放停止之后重置播放器
MyWeakObj(self);
self.player.playerDidToEnd = ^(id _Nonnull asset) {
[selfWeak.player stopCurrentPlayingCell];
};
旋轉(zhuǎn)屏幕做的處理
self.player.orientationWillChange = ^(ZFPlayerController * _Nonnull player, BOOL isFullScreen) {
[selfWeak setNeedsStatusBarAppearanceUpdate];
[UIViewController attemptRotationToDeviceOrientation];
selfWeak.storyTableView.scrollsToTop = !isFullScreen;
};
播放時間大于0.2隱藏視頻封面,也即之前設(shè)置的tag對應(yīng)的View
這樣的處理的原因在于,播放器在開始播放之后會有短暫的黑屏過程,主要是由于開始播放之后ZFPlayerLoadState狀態(tài)為ZFPlayerLoadStatePlaythroughOK,但是存在短暫的解析過程,視頻的第一幀并沒有出現(xiàn)
self.player.playerPlayTimeChanged = ^(id<ZFPlayerMediaPlayback> _Nonnull asset, NSTimeInterval currentTime, NSTimeInterval duration) {
DLog(@"當(dāng)前播放時間=%f",currentTime);
if (currentTime > 0.2) {
selfWeak.controlView.coverImageView.hidden = YES;
}
};
2.屏幕旋轉(zhuǎn)處理
對于包含UITabbarController和UINavigationController的控制器,需要分別實現(xiàn)三個方法
UITabbarController
- (BOOL)shouldAutorotate
{
return [self.selectedViewController shouldAutorotate];
}
- (NSUInteger)supportedInterfaceOrientations
{
return [self.selectedViewController supportedInterfaceOrientations];
}
- (UIInterfaceOrientation)preferredInterfaceOrientationForPresentation {
return [self.selectedViewController preferredInterfaceOrientationForPresentation];
}
UINavigationController
- (BOOL)shouldAutorotate {
return [self.topViewController shouldAutorotate];
}
- (UIInterfaceOrientationMask)supportedInterfaceOrientations {
return [self.topViewController supportedInterfaceOrientations];
}
- (UIInterfaceOrientation)preferredInterfaceOrientationForPresentation {
return [self.topViewController preferredInterfaceOrientationForPresentation];
}
對于父控制器包含子控制器的情況,如果在子控制器中有旋轉(zhuǎn)屏幕的需求,那么父控制器也要實現(xiàn)shouldAutorotate方法
3.滑動播放當(dāng)前正在顯示的cell
需要實現(xiàn)下面幾個方法
- (void)scrollViewDidEndDecelerating:(UIScrollView *)scrollView {
[scrollView zf_scrollViewDidEndDecelerating];
}
- (void)scrollViewDidEndDragging:(UIScrollView *)scrollView willDecelerate:(BOOL)decelerate {
[scrollView zf_scrollViewDidEndDraggingWillDecelerate:decelerate];
}
- (void)scrollViewDidScrollToTop:(UIScrollView *)scrollView {
[scrollView zf_scrollViewDidScrollToTop];
}
- (void)scrollViewDidScroll:(UIScrollView *)scrollView {
[scrollView zf_scrollViewDidScroll];
}
- (void)scrollViewWillBeginDragging:(UIScrollView *)scrollView {
[scrollView zf_scrollViewWillBeginDragging];
}
zf_scrollViewDidStopScrollCallback這個回調(diào)可以返回當(dāng)前正在顯示的cell,實現(xiàn)播放方法即可
// 停止的時候找出最合適的播放
MyWeakObj(self);
_storyTableView.zf_scrollViewDidStopScrollCallback = ^(NSIndexPath * _Nonnull indexPath) {
[selfWeak playTheVideoAtIndexPath:indexPath scrollToTop:NO];
};
問題: ZFPLayer寫的關(guān)于尋找當(dāng)前正在播放的cell本身是沒有問題的,但是只是不適合我公司的項目而已,在UIScrollView+ZFPlayer.m的zf_filterShouldPlayCellWhileScrolling方法中,根據(jù)tag查找到對應(yīng)View之后只做了是否存在的判斷,而我的邏輯是隱藏,所以計算的當(dāng)前顯示的cell,總是會有問題