ZFCustomControlView.m 43 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697989910010110210310410510610710810911011111211311411511611711811912012112212312412512612712812913013113213313413513613713813914014114214314414514614714814915015115215315415515615715815916016116216316416516616716816917017117217317417517617717817918018118218318418518618718818919019119219319419519619719819920020120220320420520620720820921021121221321421521621721821922022122222322422522622722822923023123223323423523623723823924024124224324424524624724824925025125225325425525625725825926026126226326426526626726826927027127227327427527627727827928028128228328428528628728828929029129229329429529629729829930030130230330430530630730830931031131231331431531631731831932032132232332432532632732832933033133233333433533633733833934034134234334434534634734834935035135235335435535635735835936036136236336436536636736836937037137237337437537637737837938038138238338438538638738838939039139239339439539639739839940040140240340440540640740840941041141241341441541641741841942042142242342442542642742842943043143243343443543643743843944044144244344444544644744844945045145245345445545645745845946046146246346446546646746846947047147247347447547647747847948048148248348448548648748848949049149249349449549649749849950050150250350450550650750850951051151251351451551651751851952052152252352452552652752852953053153253353453553653753853954054154254354454554654754854955055155255355455555655755855956056156256356456556656756856957057157257357457557657757857958058158258358458558658758858959059159259359459559659759859960060160260360460560660760860961061161261361461561661761861962062162262362462562662762862963063163263363463563663763863964064164264364464564664764864965065165265365465565665765865966066166266366466566666766866967067167267367467567667767867968068168268368468568668768868969069169269369469569669769869970070170270370470570670770870971071171271371471571671771871972072172272372472572672772872973073173273373473573673773873974074174274374474574674774874975075175275375475575675775875976076176276376476576676776876977077177277377477577677777877978078178278378478578678778878979079179279379479579679779879980080180280380480580680780880981081181281381481581681781881982082182282382482582682782882983083183283383483583683783883984084184284384484584684784884985085185285385485585685785885986086186286386486586686786886987087187287387487587687787887988088188288388488588688788888989089189289389489589689789889990090190290390490590690790890991091191291391491591691791891992092192292392492592692792892993093193293393493593693793893994094194294394494594694794894995095195295395495595695795895996096196296396496596696796896997097197297397497597697797897998098198298398498598698798898999099199299399499599699799899910001001100210031004100510061007100810091010101110121013101410151016101710181019102010211022102310241025102610271028102910301031103210331034103510361037103810391040104110421043104410451046104710481049105010511052105310541055105610571058105910601061106210631064106510661067106810691070107110721073107410751076107710781079108010811082108310841085108610871088108910901091109210931094109510961097109810991100110111021103110411051106110711081109111011111112111311141115111611171118111911201121112211231124112511261127112811291130113111321133113411351136113711381139114011411142114311441145114611471148114911501151115211531154115511561157115811591160116111621163116411651166116711681169117011711172
  1. //
  2. // ZFCustomControlView.m
  3. // ZFPlayer_Example
  4. //
  5. // Created by 紫枫 on 2019/6/5.
  6. // Copyright © 2019 紫枫. All rights reserved.
  7. //
  8. #import "ZFCustomControlView.h"
  9. #import "UIView+ZFFrame.h"
  10. #import "ZFUtilities.h"
  11. #import <ZFPlayer/ZFPlayerController.h>
  12. #import <ZFPlayer/ZFPlayerConst.h>
  13. #import "ZFSliderView.h"
  14. #import "UIImageView+ZFCache.h"
  15. #import "YBShareView.h"
  16. #import "YBVideoReportVC.h"
  17. #import "TCVideoRecordViewController.h"
  18. #import "addHotVideoVC.h"
  19. #import "commentview.h"
  20. #import "LandscapeShareView.h"
  21. @interface ZFCustomControlView () <ZFSliderViewDelegate>
  22. {
  23. BOOL _isDownLoading;
  24. MBProgressHUD *hud;
  25. NSURL *fullPathsss;
  26. }
  27. /// 底部工具栏
  28. @property (nonatomic, strong) UIView *bottomToolView;
  29. /// 顶部工具栏
  30. @property (nonatomic, strong) UIView *topToolView;
  31. /// 标题
  32. @property (nonatomic, strong) UILabel *titleLabel;
  33. /// 播放或暂停按钮
  34. @property (nonatomic, strong) UIButton *playOrPauseBtn;
  35. /// 播放的当前时间
  36. @property (nonatomic, strong) UILabel *currentTimeLabel;
  37. /// 滑杆
  38. @property (nonatomic, strong) ZFSliderView *slider;
  39. /// 视频总时间
  40. @property (nonatomic, strong) UILabel *totalTimeLabel;
  41. /// 全屏按钮
  42. @property (nonatomic, strong) UIButton *fullScreenBtn;
  43. //喜欢按钮
  44. @property (nonatomic, strong) UIButton *likeBtn;
  45. //评论按钮
  46. @property (nonatomic, strong) UIButton *commentBtn;
  47. @property (nonatomic, strong) commentview *commentView;
  48. @property (nonatomic, strong) UIView *commentBackView;
  49. @property (nonatomic, strong) LandscapeShareView *landShareView;
  50. //评论按钮
  51. @property (nonatomic, strong) UIButton *shareBtn;
  52. @property (nonatomic, assign) BOOL isShow;
  53. @property (nonatomic, assign) BOOL controlViewAppeared;
  54. @property (nonatomic, strong) dispatch_block_t afterBlock;
  55. @property (nonatomic, assign) NSTimeInterval sumTime;
  56. /// 底部播放进度
  57. @property (nonatomic, strong) ZFSliderView *bottomPgrogress;
  58. /// 加载loading
  59. @property (nonatomic, strong) ZFSpeedLoadingView *activity;
  60. /// 封面图
  61. @property (nonatomic, strong) UIImageView *coverImageView;
  62. @end
  63. @implementation ZFCustomControlView
  64. @synthesize player = _player;
  65. - (instancetype)initWithFrame:(CGRect)frame {
  66. if (self = [super initWithFrame:frame]) {
  67. // 添加子控件
  68. [self addSubview:self.topToolView];
  69. [self addSubview:self.bottomToolView];
  70. [self.topToolView addSubview:self.titleLabel];
  71. [self.bottomToolView addSubview:self.currentTimeLabel];
  72. [self.bottomToolView addSubview:self.slider];
  73. [self.bottomToolView addSubview:self.totalTimeLabel];
  74. [self.bottomToolView addSubview:self.playOrPauseBtn];
  75. [self.bottomToolView addSubview:self.likeBtn];
  76. [self.bottomToolView addSubview:self.commentBtn];
  77. [self.bottomToolView addSubview:self.shareBtn];
  78. // [self.bottomToolView addSubview:self.fullScreenBtn];
  79. // [self addSubview:self.bottomPgrogress];
  80. [self addSubview:self.fullScreenBtn];
  81. [self addSubview:self.activity];
  82. self.autoFadeTimeInterval = 0.2;
  83. self.autoHiddenTimeInterval = 2.5;
  84. // 设置子控件的响应事件
  85. [self makeSubViewsAction];
  86. [self resetControlView];
  87. self.clipsToBounds = YES;
  88. }
  89. return self;
  90. }
  91. - (void)makeSubViewsAction {
  92. [self.playOrPauseBtn addTarget:self action:@selector(playPauseButtonClickAction:) forControlEvents:UIControlEventTouchUpInside];
  93. [self.fullScreenBtn addTarget:self action:@selector(fullScreenButtonClickAction:) forControlEvents:UIControlEventTouchUpInside];
  94. }
  95. #pragma mark - ZFSliderViewDelegate
  96. - (void)sliderTouchBegan:(float)value {
  97. self.slider.isdragging = YES;
  98. }
  99. - (void)sliderTouchEnded:(float)value {
  100. if (self.player.totalTime > 0) {
  101. @zf_weakify(self)
  102. [self.player seekToTime:self.player.totalTime*value completionHandler:^(BOOL finished) {
  103. @zf_strongify(self)
  104. if (finished) {
  105. self.slider.isdragging = NO;
  106. }
  107. }];
  108. } else {
  109. self.slider.isdragging = NO;
  110. }
  111. }
  112. - (void)sliderValueChanged:(float)value {
  113. if (self.player.totalTime == 0) {
  114. self.slider.value = 0;
  115. return;
  116. }
  117. self.slider.isdragging = YES;
  118. NSString *currentTimeString = [ZFUtilities convertTimeSecond:self.player.totalTime*value];
  119. self.currentTimeLabel.text = currentTimeString;
  120. }
  121. - (void)sliderTapped:(float)value {
  122. if (self.player.totalTime > 0) {
  123. self.slider.isdragging = YES;
  124. @zf_weakify(self)
  125. [self.player seekToTime:self.player.totalTime*value completionHandler:^(BOOL finished) {
  126. @zf_strongify(self)
  127. if (finished) {
  128. self.slider.isdragging = NO;
  129. [self.player.currentPlayerManager play];
  130. }
  131. }];
  132. } else {
  133. self.slider.isdragging = NO;
  134. self.slider.value = 0;
  135. }
  136. }
  137. #pragma mark - action
  138. - (void)playPauseButtonClickAction:(UIButton *)sender {
  139. [self playOrPause];
  140. }
  141. - (void)fullScreenButtonClickAction:(UIButton *)sender {
  142. [self.player enterFullScreen:!self.player.isFullScreen animated:YES];
  143. if(_commentView){
  144. [_commentView removeFromSuperview];
  145. _commentView = nil;
  146. }
  147. if(self.bottomEvent){
  148. self.bottomEvent(@"关闭评论");
  149. }
  150. }
  151. /// 根据当前播放状态取反
  152. - (void)playOrPause {
  153. self.playOrPauseBtn.selected = !self.playOrPauseBtn.isSelected;
  154. self.playOrPauseBtn.isSelected? [self.player.currentPlayerManager play]: [self.player.currentPlayerManager pause];
  155. }
  156. - (void)playBtnSelectedState:(BOOL)selected {
  157. self.playOrPauseBtn.selected = selected;
  158. }
  159. #pragma mark - 添加子控件约束
  160. - (void)layoutSubviews {
  161. [super layoutSubviews];
  162. CGFloat min_x = 0;
  163. CGFloat min_y = 0;
  164. CGFloat min_w = 0;
  165. CGFloat min_h = 0;
  166. CGFloat min_view_w = self.bounds.size.width;
  167. CGFloat min_view_h = self.bounds.size.height;
  168. CGFloat min_margin = 9;
  169. self.coverImageView.frame = self.bounds;
  170. min_w = 80;
  171. min_h = 80;
  172. self.activity.frame = CGRectMake(min_x, min_y, min_w, min_h);
  173. self.activity.zf_centerX = self.zf_centerX;
  174. self.activity.zf_centerY = self.zf_centerY + 10;
  175. min_x = 0;
  176. min_y = 0;
  177. min_w = min_view_w;
  178. min_h = (iPhoneX && self.player.isFullScreen) ? 80 : 40;
  179. self.topToolView.frame = CGRectMake(min_x, min_y, min_w, min_h);
  180. min_x = self.player.isFullScreen ? 40: 15;
  181. min_y = 0;
  182. min_w = min_view_w - min_x - 15;
  183. min_h = 30;
  184. self.titleLabel.frame = CGRectMake(min_x, min_y, min_w, min_h);
  185. self.titleLabel.zf_centerY = self.topToolView.zf_centerY;
  186. min_h =100;// (iPhoneX && self.player.isFullScreen) ? 100 : 40;
  187. min_x = 0;
  188. min_y = min_view_h - min_h ;
  189. min_w = min_view_w;
  190. self.bottomToolView.frame = CGRectMake(min_x, min_y, min_w, min_h);
  191. // min_w = 28;
  192. // min_h = min_w;
  193. // min_x = self.bottomToolView.zf_width - min_w - ((iPhoneX && self.player.isFullScreen) ? 44: min_margin);
  194. // min_y = 0;
  195. min_x = 10;
  196. min_y= 10;
  197. min_h = 80;
  198. min_w = 80;
  199. self.fullScreenBtn.frame = CGRectMake(min_x, min_y, min_w, min_h);
  200. // self.fullScreenBtn.zf_centerY = self.currentTimeLabel.zf_centerY;
  201. min_x =0;
  202. min_y = 0;
  203. min_w =min_view_w;// self.totalTimeLabel.zf_left - min_x - 4;
  204. min_h = 30;
  205. self.slider.frame = CGRectMake(min_x, min_y, min_w, min_h);
  206. // self.slider.zf_centerY = self.currentTimeLabel.zf_centerY;
  207. min_x = 20;
  208. min_y = self.slider.bottom-10;
  209. min_w = 44;
  210. min_h = min_w;
  211. self.playOrPauseBtn.frame = CGRectMake(min_x, min_y, min_w, min_h);
  212. // self.playOrPauseBtn.center = self.center;
  213. min_x =self.playOrPauseBtn.right;// (iPhoneX && self.player.isFullScreen) ? 60: 35;
  214. min_w = 50;
  215. min_h = 28;
  216. min_y = self.slider.bottom;//(self.bottomToolView.zf_height - min_h)/2;
  217. self.currentTimeLabel.frame = CGRectMake(min_x, min_y, min_w, min_h);
  218. min_w = 62;
  219. min_h = 28;
  220. min_x = self.fullScreenBtn.zf_left - min_w - 4;
  221. min_y = self.slider.bottom;
  222. self.totalTimeLabel.frame = CGRectMake(self.currentTimeLabel.right, min_y, min_w, min_h);
  223. self.totalTimeLabel.zf_centerY = self.currentTimeLabel.zf_centerY;
  224. min_x = 0;
  225. min_y = min_view_h - 5;
  226. min_w = min_view_w;
  227. min_h = 2;
  228. self.bottomPgrogress.frame = CGRectMake(min_x, min_y, min_w, min_h);
  229. min_x = self.bottomToolView.width-110;
  230. min_y = self.slider.bottom-20;
  231. min_w = 70;
  232. min_h = 70;
  233. self.shareBtn.frame = CGRectMake(min_x, min_y, min_w, min_h);
  234. min_x = self.shareBtn.left-110;
  235. min_y = self.slider.bottom-20;
  236. min_w = 70;
  237. min_h = 70;
  238. self.commentBtn.frame = CGRectMake(min_x, min_y, min_w, min_h);
  239. min_x = self.commentBtn.left-110;
  240. min_y = self.slider.bottom-20;
  241. min_w = 70;
  242. min_h = 70;
  243. self.likeBtn.frame = CGRectMake(min_x, min_y, min_w, min_h);
  244. // self.topToolView.zf_y = 0;
  245. // self.bottomToolView.zf_y = self.zf_height - self.bottomToolView.zf_height;
  246. // self.playOrPauseBtn.alpha = 1;
  247. // if (!self.isShow) {
  248. // self.topToolView.zf_y = -self.topToolView.zf_height;
  249. // self.bottomToolView.zf_y = self.zf_height;
  250. // self.playOrPauseBtn.alpha = 0;
  251. // } else {
  252. // self.topToolView.zf_y = 0;
  253. // self.bottomToolView.zf_y = self.zf_height - self.bottomToolView.zf_height;
  254. // self.playOrPauseBtn.alpha = 1;
  255. // }
  256. }
  257. #pragma mark - private
  258. /** 重置ControlView */
  259. - (void)resetControlView {
  260. self.bottomToolView.alpha = 1;
  261. self.slider.value = 0;
  262. self.slider.bufferValue = 0;
  263. self.currentTimeLabel.text = @"00:00";
  264. self.totalTimeLabel.text = @"/00:00";
  265. // self.backgroundColor = [UIColor clearColor];
  266. self.playOrPauseBtn.selected = YES;
  267. self.titleLabel.text = @"";
  268. }
  269. - (void)showControlView {
  270. // self.topToolView.alpha = 1;
  271. // self.bottomToolView.alpha = 1;
  272. // self.isShow = YES;
  273. // self.topToolView.zf_y = 0;
  274. // self.bottomToolView.zf_y = self.zf_height - self.bottomToolView.zf_height;
  275. // self.playOrPauseBtn.alpha = 1;
  276. // self.player.statusBarHidden = NO;
  277. }
  278. - (void)hideControlView {
  279. // self.isShow = NO;
  280. // self.topToolView.zf_y = -self.topToolView.zf_height;
  281. // self.bottomToolView.zf_y = self.zf_height;
  282. // self.player.statusBarHidden = NO;
  283. // self.playOrPauseBtn.alpha = 0;
  284. // self.topToolView.alpha = 0;
  285. // self.bottomToolView.alpha = 0;
  286. }
  287. - (void)autoFadeOutControlView {
  288. // self.controlViewAppeared = YES;
  289. // [self cancelAutoFadeOutControlView];
  290. // @zf_weakify(self)
  291. // self.afterBlock = dispatch_block_create(0, ^{
  292. // @zf_strongify(self)
  293. //// [self hideControlViewWithAnimated:YES];
  294. // });
  295. // dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(self.autoHiddenTimeInterval * NSEC_PER_SEC)), dispatch_get_main_queue(),self.afterBlock);
  296. }
  297. /// 取消延时隐藏controlView的方法
  298. - (void)cancelAutoFadeOutControlView {
  299. if (self.afterBlock) {
  300. dispatch_block_cancel(self.afterBlock);
  301. self.afterBlock = nil;
  302. }
  303. }
  304. /// 隐藏控制层
  305. - (void)hideControlViewWithAnimated:(BOOL)animated {
  306. // self.controlViewAppeared = NO;
  307. // [UIView animateWithDuration:animated ? self.autoFadeTimeInterval : 0 animations:^{
  308. // [self hideControlView];
  309. // } completion:^(BOOL finished) {
  310. // self.bottomPgrogress.hidden = NO;
  311. // }];
  312. }
  313. /// 显示控制层
  314. - (void)showControlViewWithAnimated:(BOOL)animated {
  315. // self.controlViewAppeared = YES;
  316. // [self autoFadeOutControlView];
  317. // [UIView animateWithDuration:animated ? self.autoFadeTimeInterval : 0 animations:^{
  318. // [self showControlView];
  319. // } completion:^(BOOL finished) {
  320. // self.bottomPgrogress.hidden = YES;
  321. // }];
  322. }
  323. //- (BOOL)shouldResponseGestureWithPoint:(CGPoint)point withGestureType:(ZFPlayerGestureType)type touch:(nonnull UITouch *)touch {
  324. // CGRect sliderRect = [self.bottomToolView convertRect:self.slider.frame toView:self];
  325. // if (CGRectContainsPoint(sliderRect, point)) {
  326. // return NO;
  327. // }
  328. // return YES;
  329. //}
  330. /**
  331. 设置标题、封面、全屏模式
  332. @param title 视频的标题
  333. @param coverUrl 视频的封面,占位图默认是灰色的
  334. @param fullScreenMode 全屏模式
  335. */
  336. - (void)showTitle:(NSString *)title coverURLString:(NSString *)coverUrl fullScreenMode:(ZFFullScreenMode)fullScreenMode {
  337. UIImage *placeholder = [ZFUtilities imageWithColor:[UIColor colorWithRed:220/255.0 green:220/255.0 blue:220/255.0 alpha:1] size:self.coverImageView.bounds.size];
  338. [self resetControlView];
  339. [self layoutIfNeeded];
  340. [self setNeedsDisplay];
  341. self.titleLabel.text = title;
  342. self.player.orientationObserver.fullScreenMode = fullScreenMode;
  343. }
  344. /// 调节播放进度slider和当前时间更新
  345. - (void)sliderValueChanged:(CGFloat)value currentTimeString:(NSString *)timeString {
  346. self.slider.value = value;
  347. self.currentTimeLabel.text = timeString;
  348. self.slider.isdragging = YES;
  349. [UIView animateWithDuration:0.3 animations:^{
  350. self.slider.sliderBtn.transform = CGAffineTransformMakeScale(1.2, 1.2);
  351. }];
  352. }
  353. /// 滑杆结束滑动
  354. - (void)sliderChangeEnded {
  355. self.slider.isdragging = NO;
  356. [UIView animateWithDuration:0.3 animations:^{
  357. self.slider.sliderBtn.transform = CGAffineTransformIdentity;
  358. }];
  359. }
  360. #pragma mark - ZFPlayerControlViewDelegate
  361. /// 手势筛选,返回NO不响应该手势
  362. - (BOOL)gestureTriggerCondition:(ZFPlayerGestureControl *)gestureControl gestureType:(ZFPlayerGestureType)gestureType gestureRecognizer:(UIGestureRecognizer *)gestureRecognizer touch:(nonnull UITouch *)touch {
  363. // CGPoint point = [touch locationInView:self];
  364. if (self.player.isSmallFloatViewShow && !self.player.isFullScreen && gestureType != ZFPlayerGestureTypeSingleTap) {
  365. return NO;
  366. }
  367. if ([touch.view isDescendantOfView:_landShareView]||[touch.view isDescendantOfView:_commentView]) {
  368. return NO;
  369. }
  370. return YES;
  371. // return [self shouldResponseGestureWithPoint:point withGestureType:gestureType touch:touch];
  372. }
  373. /// 单击手势事件
  374. - (void)gestureSingleTapped:(ZFPlayerGestureControl *)gestureControl {
  375. if (!self.player) return;
  376. if (self.player.isSmallFloatViewShow && !self.player.isFullScreen) {
  377. // [self.player enterFullScreen:YES animated:YES];
  378. } else {
  379. // if(_landShareView)
  380. // {
  381. // [_landShareView removeFromSuperview];
  382. // _landShareView = nil;
  383. // }
  384. // if (self.controlViewAppeared) {
  385. // [self hideControlViewWithAnimated:YES];
  386. // } else {
  387. /// 显示之前先把控制层复位,先隐藏后显示
  388. // [self hideControlViewWithAnimated:NO];
  389. // [self showControlViewWithAnimated:YES];
  390. // self.topToolView.zf_y = 0;
  391. // self.bottomToolView.zf_y = self.zf_height - self.bottomToolView.zf_height;
  392. // self.playOrPauseBtn.alpha = 1;
  393. if(_landShareView)
  394. {
  395. [_landShareView removeFromSuperview];
  396. _landShareView = nil;
  397. }
  398. // }
  399. }
  400. }
  401. //- (BOOL)gestureRecognizer:(UIGestureRecognizer *)gestureRecognizer shouldReceiveTouch:(UITouch *)touch{
  402. // NSLog(@"s0000000000:%@",NSStringFromClass([touch.view class]));
  403. // if ([touch.view isDescendantOfView:_landShareView]) {
  404. // return NO;
  405. // }
  406. // return YES;
  407. //}
  408. /// 双击手势事件
  409. - (void)gestureDoubleTapped:(ZFPlayerGestureControl *)gestureControl {
  410. [self playOrPause];
  411. }
  412. /// 捏合手势事件,这里改变了视频的填充模式
  413. - (void)gesturePinched:(ZFPlayerGestureControl *)gestureControl scale:(float)scale {
  414. if (scale > 1) {
  415. self.player.currentPlayerManager.scalingMode = ZFPlayerScalingModeAspectFill;
  416. } else {
  417. self.player.currentPlayerManager.scalingMode = ZFPlayerScalingModeAspectFit;
  418. }
  419. }
  420. /// 准备播放
  421. - (void)videoPlayer:(ZFPlayerController *)videoPlayer prepareToPlay:(NSURL *)assetURL {
  422. // [self hideControlViewWithAnimated:NO];
  423. }
  424. /// 播放状态改变
  425. - (void)videoPlayer:(ZFPlayerController *)videoPlayer playStateChanged:(ZFPlayerPlaybackState)state {
  426. if (state == ZFPlayerPlayStatePlaying) {
  427. [self playBtnSelectedState:YES];
  428. /// 开始播放时候判断是否显示loading
  429. if (videoPlayer.currentPlayerManager.loadState == ZFPlayerLoadStateStalled) {
  430. [self.activity startAnimating];
  431. } else if ((videoPlayer.currentPlayerManager.loadState == ZFPlayerLoadStateStalled || videoPlayer.currentPlayerManager.loadState == ZFPlayerLoadStatePrepare)) {
  432. [self.activity startAnimating];
  433. }
  434. } else if (state == ZFPlayerPlayStatePaused) {
  435. [self playBtnSelectedState:NO];
  436. /// 暂停的时候隐藏loading
  437. [self.activity stopAnimating];
  438. } else if (state == ZFPlayerPlayStatePlayFailed) {
  439. [self.activity stopAnimating];
  440. }
  441. }
  442. /// 加载状态改变
  443. - (void)videoPlayer:(ZFPlayerController *)videoPlayer loadStateChanged:(ZFPlayerLoadState)state {
  444. if (state == ZFPlayerLoadStatePrepare) {
  445. self.coverImageView.hidden = NO;
  446. } else if (state == ZFPlayerLoadStatePlaythroughOK || state == ZFPlayerLoadStatePlayable) {
  447. self.coverImageView.hidden = YES;
  448. self.player.currentPlayerManager.view.backgroundColor = [UIColor blackColor];
  449. }
  450. if (state == ZFPlayerLoadStateStalled && videoPlayer.currentPlayerManager.isPlaying) {
  451. [self.activity startAnimating];
  452. } else if ((state == ZFPlayerLoadStateStalled || state == ZFPlayerLoadStatePrepare) && videoPlayer.currentPlayerManager.isPlaying) {
  453. [self.activity startAnimating];
  454. } else {
  455. [self.activity stopAnimating];
  456. }
  457. }
  458. /// 播放进度改变回调
  459. - (void)videoPlayer:(ZFPlayerController *)videoPlayer currentTime:(NSTimeInterval)currentTime totalTime:(NSTimeInterval)totalTime {
  460. if (!self.slider.isdragging) {
  461. NSString *currentTimeString = [ZFUtilities convertTimeSecond:currentTime];
  462. self.currentTimeLabel.text = currentTimeString;
  463. NSString *totalTimeString = [ZFUtilities convertTimeSecond:totalTime];
  464. self.totalTimeLabel.text =[NSString stringWithFormat:@"/ %@",totalTimeString];
  465. self.slider.value = videoPlayer.progress;
  466. }
  467. self.bottomPgrogress.value = videoPlayer.progress;
  468. }
  469. /// 缓冲改变回调
  470. - (void)videoPlayer:(ZFPlayerController *)videoPlayer bufferTime:(NSTimeInterval)bufferTime {
  471. self.slider.bufferValue = videoPlayer.bufferProgress;
  472. self.bottomPgrogress.bufferValue = videoPlayer.bufferProgress;
  473. }
  474. - (void)videoPlayer:(ZFPlayerController *)videoPlayer presentationSizeChanged:(CGSize)size {
  475. }
  476. /// 视频view即将旋转
  477. - (void)videoPlayer:(ZFPlayerController *)videoPlayer orientationWillChange:(ZFOrientationObserver *)observer {
  478. if (videoPlayer.isSmallFloatViewShow) {
  479. if (observer.isFullScreen) {
  480. self.controlViewAppeared = NO;
  481. [self cancelAutoFadeOutControlView];
  482. }
  483. }
  484. // if (self.controlViewAppeared) {
  485. // [self showControlViewWithAnimated:NO];
  486. // } else {
  487. // [self hideControlViewWithAnimated:NO];
  488. // }
  489. }
  490. /// 视频view已经旋转
  491. - (void)videoPlayer:(ZFPlayerController *)videoPlayer orientationDidChanged:(ZFOrientationObserver *)observer {
  492. // if (self.controlViewAppeared) {
  493. // [self showControlViewWithAnimated:NO];
  494. // } else {
  495. // [self hideControlViewWithAnimated:NO];
  496. // }
  497. // [self layoutIfNeeded];
  498. // [self setNeedsDisplay];
  499. }
  500. /// 锁定旋转方向
  501. - (void)lockedVideoPlayer:(ZFPlayerController *)videoPlayer lockedScreen:(BOOL)locked {
  502. [self showControlViewWithAnimated:YES];
  503. }
  504. #pragma mark - setter
  505. - (void)setPlayer:(ZFPlayerController *)player {
  506. _player = player;
  507. }
  508. #pragma mark - getter
  509. - (UIView *)topToolView {
  510. if (!_topToolView) {
  511. _topToolView = [[UIView alloc] init];
  512. UIImage *image = ZFPlayer_Image(@"ZFPlayer_top_shadow");
  513. _topToolView.layer.contents = (id)image.CGImage;
  514. }
  515. return _topToolView;
  516. }
  517. - (UILabel *)titleLabel {
  518. if (!_titleLabel) {
  519. _titleLabel = [[UILabel alloc] init];
  520. _titleLabel.textColor = [UIColor whiteColor];
  521. _titleLabel.font = [UIFont systemFontOfSize:15.0];
  522. }
  523. return _titleLabel;
  524. }
  525. - (UIView *)bottomToolView {
  526. if (!_bottomToolView) {
  527. _bottomToolView = [[UIView alloc] init];
  528. UIImage *image = ZFPlayer_Image(@"ZFPlayer_bottom_shadow");
  529. _bottomToolView.layer.contents = (id)image.CGImage;
  530. }
  531. return _bottomToolView;
  532. }
  533. - (UIButton *)playOrPauseBtn {
  534. if (!_playOrPauseBtn) {
  535. _playOrPauseBtn = [UIButton buttonWithType:UIButtonTypeCustom];
  536. [_playOrPauseBtn setImage:ZFPlayer_Image(@"new_allPlay_44x44_") forState:UIControlStateNormal];
  537. [_playOrPauseBtn setImage:ZFPlayer_Image(@"new_allPause_44x44_") forState:UIControlStateSelected];
  538. }
  539. return _playOrPauseBtn;
  540. }
  541. - (UIButton *)likeBtn {
  542. if(!_likeBtn){
  543. _likeBtn = [UIButton buttonWithType:UIButtonTypeCustom];
  544. [_likeBtn setImage:[UIImage imageNamed:@"home_zan"] forState:0];
  545. _likeBtn.titleLabel.font = [UIFont systemFontOfSize:13];
  546. [_likeBtn setTitleEdgeInsets:UIEdgeInsetsMake(0, 5, 0, 0 )];
  547. [_likeBtn setTitle:@"0" forState:0];
  548. [_likeBtn addTarget:self action:@selector(clickLikeBtn) forControlEvents:UIControlEventTouchUpInside];
  549. }
  550. return _likeBtn;
  551. }
  552. -(UIButton *)shareBtn{
  553. if(!_shareBtn){
  554. _shareBtn = [UIButton buttonWithType:UIButtonTypeCustom];
  555. [_shareBtn setImage:[UIImage imageNamed:@"home_share"] forState:0];
  556. _shareBtn.titleLabel.font = [UIFont systemFontOfSize:13];
  557. [_shareBtn setTitleEdgeInsets:UIEdgeInsetsMake(0, 5, 0, 0 )];
  558. [_shareBtn setTitle:@"0" forState:0];
  559. [_shareBtn addTarget:self action:@selector(clickEnjoyBtn) forControlEvents:UIControlEventTouchUpInside];
  560. }
  561. return _shareBtn;
  562. }
  563. -(UIButton *)commentBtn{
  564. if(!_commentBtn){
  565. _commentBtn = [UIButton buttonWithType:UIButtonTypeCustom];
  566. [_commentBtn setImage:[UIImage imageNamed:@"home_comment"] forState:0];
  567. _commentBtn.titleLabel.font = [UIFont systemFontOfSize:13];
  568. [_commentBtn setTitleEdgeInsets:UIEdgeInsetsMake(0, 5, 0, 0 )];
  569. [_commentBtn setTitle:@"0" forState:0];
  570. [_commentBtn addTarget:self action:@selector(clickCommentBtn) forControlEvents:UIControlEventTouchUpInside];
  571. }
  572. return _commentBtn;
  573. }
  574. - (UILabel *)currentTimeLabel {
  575. if (!_currentTimeLabel) {
  576. _currentTimeLabel = [[UILabel alloc] init];
  577. _currentTimeLabel.textColor = [UIColor whiteColor];
  578. _currentTimeLabel.font = [UIFont systemFontOfSize:14.0f];
  579. _currentTimeLabel.textAlignment = NSTextAlignmentCenter;
  580. }
  581. return _currentTimeLabel;
  582. }
  583. - (ZFSliderView *)slider {
  584. if (!_slider) {
  585. _slider = [[ZFSliderView alloc] init];
  586. _slider.delegate = self;
  587. _slider.maximumTrackTintColor = [UIColor colorWithRed:0.5 green:0.5 blue:0.5 alpha:0.8];
  588. _slider.bufferTrackTintColor = [UIColor colorWithRed:1 green:1 blue:1 alpha:0.5];
  589. _slider.minimumTrackTintColor = [UIColor whiteColor];
  590. [_slider setThumbImage:ZFPlayer_Image(@"ZFPlayer_slider") forState:UIControlStateNormal];
  591. _slider.sliderHeight = 2;
  592. }
  593. return _slider;
  594. }
  595. - (UILabel *)totalTimeLabel {
  596. if (!_totalTimeLabel) {
  597. _totalTimeLabel = [[UILabel alloc] init];
  598. _totalTimeLabel.textColor = [UIColor whiteColor];
  599. _totalTimeLabel.font = [UIFont systemFontOfSize:14.0f];
  600. _totalTimeLabel.textAlignment = NSTextAlignmentCenter;
  601. }
  602. return _totalTimeLabel;
  603. }
  604. - (UIButton *)fullScreenBtn {
  605. if (!_fullScreenBtn) {
  606. _fullScreenBtn = [UIButton buttonWithType:UIButtonTypeCustom];
  607. [_fullScreenBtn setImage:[UIImage imageNamed:@"full_返回"] forState:UIControlStateNormal];
  608. }
  609. return _fullScreenBtn;
  610. }
  611. - (UIImageView *)coverImageView {
  612. if (!_coverImageView) {
  613. _coverImageView = [[UIImageView alloc] init];
  614. _coverImageView.userInteractionEnabled = YES;
  615. }
  616. return _coverImageView;
  617. }
  618. - (ZFSliderView *)bottomPgrogress {
  619. if (!_bottomPgrogress) {
  620. _bottomPgrogress = [[ZFSliderView alloc] init];
  621. _bottomPgrogress.maximumTrackTintColor = [UIColor clearColor];
  622. _bottomPgrogress.minimumTrackTintColor = [UIColor whiteColor];
  623. _bottomPgrogress.bufferTrackTintColor = [UIColor colorWithRed:1 green:1 blue:1 alpha:0.5];
  624. _bottomPgrogress.sliderHeight = 1;
  625. _bottomPgrogress.isHideSliderBlock = NO;
  626. }
  627. return _bottomPgrogress;
  628. }
  629. -(void)clickLikeBtn{
  630. NSLog(@"like:%@",_playDoc);
  631. if ([[Config getOwnID] intValue] <= 0) {
  632. [self.player enterFullScreen:!self.player.isFullScreen animated:YES];
  633. [PublicObj warnLogin];
  634. return;
  635. }
  636. if([[_playDoc valueForKey:@"uid"] isEqual:[Config getOwnID]]){
  637. [MBProgressHUD showError:@"不能给自己点赞" toView:self];
  638. return;
  639. }
  640. _likeBtn.userInteractionEnabled = NO;
  641. YBWeakSelf;
  642. [YBNetworking postWithUrl:@"Video.addLike" Dic:@{@"videoid":minstr([_playDoc valueForKey:@"id"])} Suc:^(int code, id info, NSString *msg) {
  643. //[MBProgressHUD hideHUD];
  644. _likeBtn.userInteractionEnabled = YES;
  645. if(code == 0) {
  646. NSDictionary *infoDic = [info firstObject];
  647. NSString *isLike = minstr([infoDic valueForKey:@"islike"]);
  648. NSString *likes = minstr([infoDic valueForKey:@"likes"]);
  649. NSDictionary *newDic = @{@"islike":isLike,@"likes":likes};
  650. [weakSelf updateDataDic:newDic];
  651. [_likeBtn setTitle:likes forState:0];
  652. [weakSelf likeAnimationShowIsLike:isLike];
  653. }else{
  654. [MBProgressHUD showPop:msg];
  655. }
  656. } Fail:^(id fail) {
  657. //[MBProgressHUD hideHUD];
  658. _likeBtn.userInteractionEnabled = YES;
  659. }];
  660. }
  661. ///点赞、评论、关注后这里也更新一下
  662. -(void)updateDataDic:(NSDictionary *)dic {
  663. NSMutableDictionary *m_dic = [NSMutableDictionary dictionaryWithDictionary:_playDoc];
  664. [m_dic addEntriesFromDictionary:dic];
  665. _playDoc = [NSDictionary dictionaryWithDictionary:m_dic];
  666. // if (![PublicObj checkNull:_fromWhere]) {
  667. [[NSUserDefaults standardUserDefaults]setObject:_playDoc forKey:@"yb_update_video_on_other"];
  668. // }
  669. }
  670. //点赞-取消赞动画
  671. -(void)likeAnimationShowIsLike:(NSString *)isLike {
  672. NSMutableArray *m_sel_arr = [NSMutableArray array];
  673. NSString *endImgName = @"";
  674. if ([isLike isEqual:@"1"]) {
  675. for (int i=1; i<=12; i++) {
  676. UIImage *img = [UIImage imageNamed:[NSString stringWithFormat:@"icon_video_zan_%02d",i]];
  677. [m_sel_arr addObject:img];
  678. }
  679. endImgName = @"icon_video_zan_12";
  680. }else{
  681. for (int i=1; i<=6; i++) {
  682. UIImage *img = [UIImage imageNamed:[NSString stringWithFormat:@"icon_video_zan_cancel_%02d",i]];
  683. [m_sel_arr addObject:img];
  684. }
  685. endImgName = @"icon_video_zan_01";
  686. }
  687. CGFloat showTime = 0.05*m_sel_arr.count;
  688. _likeBtn.imageView.animationImages = m_sel_arr;
  689. _likeBtn.imageView.animationDuration = showTime;
  690. _likeBtn.imageView.animationRepeatCount = 1;
  691. [_likeBtn.imageView startAnimating];
  692. dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)((showTime-0.06) * NSEC_PER_SEC)), dispatch_get_main_queue(), ^{
  693. [_likeBtn.imageView stopAnimating];
  694. [_likeBtn setImage:[UIImage imageNamed:endImgName] forState:0];
  695. });
  696. }
  697. -(void)setPlayDoc:(NSDictionary *)playDoc
  698. {
  699. NSLog(@"------cotrolview ==:%@",playDoc);
  700. _playDoc = playDoc;
  701. [self.likeBtn setTitle:minstr([playDoc valueForKey:@"likes"]) forState:0];
  702. NSString *isLike = minstr([playDoc valueForKey:@"islike"]);
  703. if ([isLike isEqual:@"1"]) {
  704. [_likeBtn setImage:[UIImage imageNamed:@"home_zan_sel"] forState:0];
  705. }else {
  706. [_likeBtn setImage:[UIImage imageNamed:@"home_zan"] forState:0];
  707. }
  708. [self.commentBtn setTitle:minstr([playDoc valueForKey:@"comments"]) forState:0];
  709. [self.shareBtn setTitle:minstr([playDoc valueForKey:@"shares"]) forState:0];
  710. }
  711. #pragma mark - 分享
  712. -(void)clickEnjoyBtn {
  713. //NSLog(@"enjoy:%@",_dataDic);
  714. YBWeakSelf;
  715. [MBProgressHUD showMessage:@""];
  716. [YBNetworking postWithUrl:@"Video.checkPayVideoIsShare" Dic:@{@"videoid":minstr([self.playDoc valueForKey:@"id"])} Suc:^(int code, id info, NSString *msg) {
  717. [MBProgressHUD hideHUD];
  718. if (code == 0) {
  719. if ([info isKindOfClass:[NSArray class]]) {
  720. [weakSelf shareLimit:[info firstObject]];
  721. }else {
  722. [weakSelf shareLimit:info];
  723. }
  724. }else {
  725. [MBProgressHUD showError:msg];
  726. }
  727. } Fail:^(id fail) {
  728. [MBProgressHUD hideHUD];
  729. }];
  730. }
  731. -(void)shareLimit:(NSDictionary *)infoDic {
  732. YBWeakSelf;
  733. CGFloat min_view_w = self.bounds.size.width;
  734. CGFloat min_view_h = self.bounds.size.height;
  735. _landShareView = [[LandscapeShareView alloc]initWithFrame: CGRectMake(min_view_w-min_view_w *0.4,0, min_view_w *0.4, min_view_h)parameter:_playDoc andlimitDic:infoDic];
  736. _landShareView.shareEvent = ^(int codeEvent, NSString *nums) {
  737. if (codeEvent == 2){
  738. //举报
  739. if ([[Config getOwnID] intValue] <= 0) {
  740. [self.player enterFullScreen:!self.player.isFullScreen animated:YES];
  741. [PublicObj warnLogin];
  742. return;
  743. }
  744. [self.player enterFullScreen:!self.player.isFullScreen animated:YES];
  745. YBVideoReportVC *jubao = [[YBVideoReportVC alloc]init];
  746. jubao.dongtaiId = minstr([weakSelf.playDoc valueForKey:@"id"]);;
  747. jubao.fromWhere = @"LookVideo";
  748. [[YBBaseAppDelegate sharedAppDelegate]pushViewController:jubao animated:YES];
  749. }else if (codeEvent == 4){
  750. //合拍
  751. if ([[Config getOwnID] intValue] <= 0) {
  752. [self.player enterFullScreen:!self.player.isFullScreen animated:YES];
  753. [PublicObj warnLogin];
  754. return;
  755. }
  756. if (self.player.totalTime < 5) {
  757. [MBProgressHUD showPop:YZMsg(@"该视频时长太短,无法合拍")];
  758. [[NSFileManager defaultManager] removeItemAtPath:nums error:nil];
  759. return;
  760. }
  761. if ([YBYoungManager shareInstance].youngSwitch == 1) {
  762. [MBProgressHUD showError:YZMsg(@"青少年模式下不支持该功能")];
  763. return;
  764. }
  765. [self.player enterFullScreen:!self.player.isFullScreen animated:YES];
  766. TCVideoRecordViewController *recorddVC = [[TCVideoRecordViewController alloc]init];
  767. recorddVC.mp4Path = nums;
  768. recorddVC.recordType = RecordType_Chorus;
  769. [[YBBaseAppDelegate sharedAppDelegate]pushViewController:recorddVC animated:YES];
  770. }else if (codeEvent == 5){
  771. //上热门
  772. if ([[Config getOwnID] intValue] <= 0) {
  773. [self.player enterFullScreen:!self.player.isFullScreen animated:YES];
  774. [PublicObj warnLogin];
  775. return;
  776. }
  777. if ([YBYoungManager shareInstance].youngSwitch == 1) {
  778. [MBProgressHUD showError:YZMsg(@"青少年模式下不支持该功能")];
  779. return;
  780. }
  781. [self.player enterFullScreen:!self.player.isFullScreen animated:YES];
  782. addHotVideoVC *hot = [[addHotVideoVC alloc]init];
  783. hot.videoInfo = self.playDoc;
  784. [[YBBaseAppDelegate sharedAppDelegate]pushViewController:hot animated:YES];
  785. }else if (codeEvent == 7){
  786. // 收藏
  787. if ([[Config getOwnID] intValue] <= 0) {
  788. [self.player enterFullScreen:!self.player.isFullScreen animated:YES];
  789. [PublicObj warnLogin];
  790. return;
  791. }
  792. [self.player enterFullScreen:!self.player.isFullScreen animated:YES];
  793. [weakSelf clickVideoCollectionAni:NO];
  794. }else if (codeEvent == 8){
  795. if (![minstr([infoDic valueForKey:@"limit_status"]) isEqual:@"1"]) {
  796. [MBProgressHUD showError:YZMsg(@"该视频不能复制链接")];
  797. return;
  798. }
  799. UIPasteboard *paste = [UIPasteboard generalPasteboard];
  800. if (![PublicObj checkNull:[_playDoc valueForKey:@"href"]]) {
  801. NSString *href = [NSString stringWithFormat:@"%@",[_playDoc valueForKey:@"href_w"]];
  802. if (href.length <= 0) {
  803. [MBProgressHUD showError:YZMsg(@"该视频暂不支持复制链接")];
  804. return;
  805. }
  806. [self.player enterFullScreen:!self.player.isFullScreen animated:YES];
  807. href = [PublicObj decrypt:href];
  808. paste.string = href;
  809. [MBProgressHUD showSuccess:YZMsg(@"复制成功")];
  810. }
  811. }else if (codeEvent == 9){
  812. if (![minstr([infoDic valueForKey:@"limit_status"]) isEqual:@"1"]) {
  813. [MBProgressHUD showError:YZMsg(@"该视频不能保存")];
  814. return;
  815. }
  816. [self.player enterFullScreen:!self.player.isFullScreen animated:YES];
  817. _isDownLoading = YES;
  818. [self downloadVideo:RKDownType_Save];
  819. }else if (codeEvent == 10){
  820. if ([[Config getOwnID]intValue]<0) {
  821. [self.player enterFullScreen:!self.player.isFullScreen animated:YES];
  822. [PublicObj warnLogin];
  823. return;
  824. }
  825. if (![minstr([infoDic valueForKey:@"video_status"]) isEqual:@"1"]) {
  826. [MBProgressHUD showError:minstr([infoDic valueForKey:@"video_msg"])];
  827. return;
  828. }
  829. if (![minstr([infoDic valueForKey:@"limit_status"]) isEqual:@"1"]) {
  830. [MBProgressHUD showError:YZMsg(@"该视频不能合拍")];
  831. return;
  832. }
  833. [self.player enterFullScreen:!self.player.isFullScreen animated:YES];
  834. _isDownLoading = YES;
  835. [self downloadVideo:RKDownType_Chorus];
  836. }
  837. };
  838. _landShareView.shareHideEvent = ^{
  839. [weakSelf.landShareView removeFromSuperview];
  840. weakSelf.landShareView = nil;
  841. };
  842. [self addSubview:_landShareView];
  843. }
  844. -(void)clickVideoCollectionAni:(BOOL)animation {
  845. NSString *videoID = minstr([self.playDoc valueForKey:@"id"]);
  846. YBWeakSelf;
  847. [YBNetworking postWithUrl:@"video.addCollection" Dic:@{@"videoid":videoID} Suc:^(int code, id info, NSString *msg) {
  848. if (code == 0) {
  849. NSDictionary *infoDic = [info firstObject];
  850. NSString *iscollection = minstr([infoDic valueForKey:@"iscollection"]);
  851. NSString *collections = minstr([infoDic valueForKey:@"collections"]);
  852. NSDictionary *newDic = @{@"iscollection":iscollection,@"collections":collections};
  853. // [weakSelf updateDataDic:newDic];
  854. // if (weakSelf.videoCellEvent) {
  855. // weakSelf.videoCellEvent(@"视频-收藏", newDic);
  856. // }
  857. // [_collectionBtn setTitle:collections forState:0];
  858. // _collectionBtn = [PublicObj setUpImgDownText:_collectionBtn];
  859. // _collectionBtn.selected = [iscollection intValue];
  860. if (animation) {
  861. [weakSelf colAnimationWithIsCol:iscollection];
  862. }else{
  863. [MBProgressHUD showError:msg];
  864. }
  865. }else{
  866. [MBProgressHUD showError:msg];
  867. }
  868. } Fail:^(id fail) {
  869. }];
  870. }
  871. //收藏-取消收藏动画
  872. -(void)colAnimationWithIsCol:(NSString *)isCol {
  873. NSMutableArray *m_sel_arr = [NSMutableArray array];
  874. NSString *endImgName = @"";
  875. UIControlState btnState;
  876. if ([isCol isEqual:@"1"]) {
  877. for (int i=1; i<=12; i++) {
  878. UIImage *img = [UIImage imageNamed:[NSString stringWithFormat:@"icon_video_col_%02d",i]];
  879. [m_sel_arr addObject:img];
  880. }
  881. btnState = UIControlStateSelected;
  882. endImgName = @"icon_video_col_12";
  883. }else{
  884. for (int i=1; i<=6; i++) {
  885. UIImage *img = [UIImage imageNamed:[NSString stringWithFormat:@"icon_video_col_cancel_%02d",i]];
  886. [m_sel_arr addObject:img];
  887. }
  888. btnState = UIControlStateNormal;
  889. endImgName = @"icon_video_col_01";
  890. }
  891. }
  892. -(void)clickCommentBtn {
  893. if ([[Config getOwnID] intValue] <= 0) {
  894. [self.player enterFullScreen:!self.player.isFullScreen animated:YES];
  895. [PublicObj warnLogin];
  896. return;
  897. }
  898. NSLog(@"comment:%@",_playDoc);
  899. NSDictionary *userDic = [_playDoc valueForKey:@"userinfo"];
  900. NSString *videoUserID = minstr([userDic valueForKey:@"id"]);
  901. NSString *videoID = minstr([_playDoc valueForKey:@"id"]);
  902. NSString *commentStr = minstr([_playDoc valueForKey:@"comments"]);
  903. CGFloat min_view_w = self.bounds.size.width;
  904. CGFloat min_view_h = self.bounds.size.height;
  905. YBWeakSelf;
  906. _commentView = [[commentview alloc]initWithFrame:CGRectMake(min_view_w-min_view_w *0.4,0, min_view_w *0.4, _window_width) hide:^(NSString *type) {
  907. } andvideoid:videoID andhostid:videoUserID count:[commentStr intValue] talkCount:^(id type) {
  908. // [weakSelf updateCommentNums:type];
  909. } detail:^(id type) {
  910. } youke:^(id type) {
  911. // [weakSelf comNeedLogin];
  912. } andFrom:@""];
  913. [_commentView resetFream];
  914. _commentView.closeEvent = ^{
  915. [weakSelf.commentView removeFromSuperview];
  916. weakSelf.commentView = nil;
  917. };
  918. [self addSubview:_commentView];
  919. }
  920. //下载视频到本地
  921. -(void)downloadVideo:(RKDownType)downType{
  922. // [self dismiss];
  923. NSString *href = [NSString stringWithFormat:@"%@",[self.playDoc valueForKey:@"href_w"]];
  924. if (downType == RKDownType_Chorus) {
  925. href = [NSString stringWithFormat:@"%@",[self.playDoc valueForKey:@"href"]];
  926. }
  927. href = [PublicObj decrypt:href];
  928. if (href.length <= 0 || [href containsString:@".m3u8"]) {
  929. if (downType == RKDownType_Save) {
  930. [MBProgressHUD showError:YZMsg(@"该视频暂不支持下载")];
  931. }else {
  932. [MBProgressHUD showError:YZMsg(@"该视频暂不支持合拍")];
  933. }
  934. _isDownLoading = NO;
  935. // [self dismiss];
  936. return;
  937. }
  938. NSString *title = [NSString stringWithFormat:@"%@",[self.playDoc valueForKey:@"title"]];
  939. if (title.length == 0) {
  940. NSDate* dat = [NSDate dateWithTimeIntervalSinceNow:0];
  941. NSTimeInterval a=[dat timeIntervalSince1970]*1000;
  942. NSString *timeString = [NSString stringWithFormat:@"%d", (int)a];
  943. title = timeString;
  944. }
  945. hud = [MBProgressHUD showHUDAddedTo:[YBBaseAppDelegate sharedAppDelegate].topViewController.view animated:YES];
  946. hud.mode = MBProgressHUDModeAnnularDeterminate;
  947. NSString *showDesText = YZMsg(@"正在下载视频");
  948. downType == RKDownType_Save ? (showDesText = YZMsg(@"正在下载视频")):(showDesText = YZMsg(@"请稍等..."));
  949. hud.label.text = showDesText;
  950. //1.创建会话管理者
  951. //AFHTTPSessionManager *manager =[AFHTTPSessionManager manager];
  952. NSURL *url = [NSURL URLWithString:href];
  953. NSURLRequest *request = [NSURLRequest requestWithURL:url];
  954. NSMutableURLRequest *m_reques = [request mutableCopy];
  955. [m_reques addValue:h5url forHTTPHeaderField:@"referer"];
  956. request = [m_reques copy];
  957. NSURLSessionDownloadTask *download = [[YBNetworking ybnetManager] downloadTaskWithRequest:request progress:^(NSProgress * _Nonnull downloadProgress) {
  958. //hud.progress = downloadProgress.fractionCompleted;
  959. dispatch_async(dispatch_get_main_queue(), ^{
  960. hud.progress = downloadProgress.completedUnitCount / downloadProgress.totalUnitCount;
  961. });
  962. //监听下载进度
  963. //completedUnitCount 已经下载的数据大小
  964. //totalUnitCount 文件数据的中大小
  965. NSLog(@"%f",1.0 *downloadProgress.completedUnitCount / downloadProgress.totalUnitCount);
  966. } destination:^NSURL * _Nonnull(NSURL * _Nonnull targetPath, NSURLResponse * _Nonnull response) {
  967. NSString *fullPath = [[NSSearchPathForDirectoriesInDomains(NSCachesDirectory, NSUserDomainMask, YES) lastObject] stringByAppendingPathComponent:response.suggestedFilename];
  968. NSLog(@"targetPath:%@",targetPath);
  969. NSLog(@"fullPath:%@",fullPath);
  970. return [NSURL fileURLWithPath:fullPath];
  971. } completionHandler:^(NSURLResponse * _Nonnull response, NSURL * _Nullable filePath, NSError * _Nullable error) {
  972. fullPathsss = filePath;
  973. NSLog(@"%@",filePath);
  974. if (downType == RKDownType_Save) {
  975. UISaveVideoAtPathToSavedPhotosAlbum([filePath path], self, @selector(video:didFinishSavingWithError:contextInfo:), nil);
  976. }else {
  977. dispatch_async(dispatch_get_main_queue(), ^{
  978. _isDownLoading = NO;
  979. // [self dismiss];
  980. [MBProgressHUD hideHUDForView:[YBBaseAppDelegate sharedAppDelegate].topViewController.view animated:YES];
  981. if ([PublicObj checkNull:[fullPathsss path]]) {
  982. [MBProgressHUD showPop:YZMsg(@"该视频暂不支持合拍")];
  983. return ;
  984. }
  985. // if (self.shareEvent) {
  986. // self.shareEvent(4, [fullPathsss path]);
  987. // }
  988. if (self.player.totalTime < 5) {
  989. [MBProgressHUD showPop:YZMsg(@"该视频时长太短,无法合拍")];
  990. [[NSFileManager defaultManager] removeItemAtPath:[fullPathsss path] error:nil];
  991. return;
  992. }
  993. if ([YBYoungManager shareInstance].youngSwitch == 1) {
  994. [MBProgressHUD showError:YZMsg(@"青少年模式下不支持该功能")];
  995. return;
  996. }
  997. TCVideoRecordViewController *recorddVC = [[TCVideoRecordViewController alloc]init];
  998. recorddVC.mp4Path = [fullPathsss path];
  999. recorddVC.recordType = RecordType_Chorus;
  1000. [[YBBaseAppDelegate sharedAppDelegate]pushViewController:recorddVC animated:YES];
  1001. });
  1002. }
  1003. }];
  1004. //3.执行Task
  1005. [download resume];
  1006. }
  1007. - (void)video:(NSString *)videoPath didFinishSavingWithError:(NSError *)error contextInfo: (void *)contextInfo {
  1008. if (error == nil) {
  1009. NSLog(@"视频保存成功");
  1010. hud.label.text = YZMsg(@"视频保存成功");
  1011. }else{
  1012. NSLog(@"视频保存失败");
  1013. hud.label.text = YZMsg(@"频保存失败");
  1014. }
  1015. dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(2.0 * NSEC_PER_SEC)), dispatch_get_main_queue(), ^{
  1016. [MBProgressHUD hideHUDForView:[YBBaseAppDelegate sharedAppDelegate].topViewController.view animated:YES];
  1017. _isDownLoading = NO;
  1018. // [self dismiss];
  1019. });
  1020. BOOL isOk = [[NSFileManager defaultManager] removeItemAtPath:[fullPathsss path] error:nil];
  1021. NSLog(@"%d",isOk);
  1022. }
  1023. @end