首先我們來分析一下這個界面,這是個豎向滑動的 scrollView,我們可以在 scrollView 上添加 3 個 view,然后將 scrollView 滾到中間紅色 view 的位置,以后每次用戶滑動完成以后,都將 scrollView 重置到這個狀態(tài),這樣就能實現(xiàn)抖音那種無限滑動的效果。
然后,每次用戶滑動完就開始播放視頻,這樣我們就能實現(xiàn)抖音這個效果了。有了思路,接下來開始寫代碼。
-?(void)viewDidAppear:(BOOL)animated?{
????[super?viewDidAppear:animated];?self.scrollViewOffsetYOnStartDrag?=?-100;
????[self?scrollViewDidEndScrolling];
}
-?(void)viewDidDisappear:(BOOL)animated?{
????[super?viewDidDisappear:animated];
????[self.secondImageView?jp_stopPlay];
}?#pragma?mark?-?UIScrollViewDelegate?-?(void)scrollViewDidEndDragging:(UIScrollView?*)scrollView
??????????????????willDecelerate:(BOOL)decelerate?{?if?(decelerate?==?NO)?{
????????[self?scrollViewDidEndScrolling];
????}
}
-?(void)scrollViewDidEndDecelerating:(UIScrollView?*)scrollView{
????[self?scrollViewDidEndScrolling];
}
-?(void)scrollViewWillBeginDragging:(UIScrollView?*)scrollView?{?self.scrollViewOffsetYOnStartDrag?=?scrollView.contentOffset.y;
}?#pragma?mark?-?JPVideoPlayerDelegate?-?(BOOL)shouldShowBlackBackgroundBeforePlaybackStart?{?return?YES;
}?#pragma?mark?-?Private?-?(void)scrollViewDidEndScrolling?{?if(self.scrollViewOffsetYOnStartDrag?==?self.scrollView.contentOffset.y){?return;
????}?CGSize?referenceSize?=?UIScreen.mainScreen.bounds.size;
????[self.scrollView?setContentOffset:CGPointMake(0,?referenceSize.height)?animated:NO];
}
-?(NSURL?*)fetchDouyinURL?{?if(self.currentVideoIndex?==?(self.douyinVideoStrings.count?-?1)){?self.currentVideoIndex?=?0;
????}?NSURL?*url?=?[NSURL?URLWithString:self.douyinVideoStrings[self.currentVideoIndex]];?self.currentVideoIndex++;?return?url;
}
代碼寫到這里就能實現(xiàn)無限滑動的效果了,這很簡單,對吧?
那如何播放視頻呢?我們應該引入AVFoundation,然后實例化AVPlayer,然后創(chuàng)建視頻圖層,然后監(jiān)聽視頻播放狀態(tài),再開始播放視頻。這只是一部分,接下來開始監(jiān)聽播放器的視頻進度變化,開始定制播放進度指示器。然后還要處理音頻的輸出問題,還要處理前后臺事件……
像抖音這樣好的用戶體驗,視頻數(shù)據(jù)都是邊下邊播緩存在本地的,那如何實現(xiàn)基于AVPlayer的邊下邊播技術呢?
問題似乎沒有那么簡單,這樣算下來,5 分鐘絕對寫不完。
這時就輪到視頻利器JPVideoPlayer上場了。只要下面一行代碼,上面所有的事情全部幫你搞定,信不信?不信就試試看。
[self.secondImageView?jp_playVideoMuteWithURL:[self?fetchDouyinURL]
???????????????????????????????bufferingIndicator:nil?progressView:[JPDouyinProgressView?new]
??????????????????????????configurationCompletion:^(UIView?*view,?JPVideoPlayerModel?*playerModel)?{
??????????????????????????????view.jp_muted?=?NO;
??????????????????????????}];