JXVideoCell.m 10 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299
  1. //
  2. // JXVideoCell.m
  3. // shiku_im
  4. //
  5. // Created by Apple on 16/10/10.
  6. // Copyright © 2016年 Reese. All rights reserved.
  7. //
  8. #import "JXVideoCell.h"
  9. #import <AVFoundation/AVFoundation.h>
  10. #import "JXVideoPlayer.h"
  11. #import "SCGIFImageView.h"
  12. @implementation JXVideoCell
  13. - (void)dealloc{
  14. NSLog(@"JXVideoCell.dealloc");
  15. //[g_notify removeObserver:self name:kCellReadDelNotification object:self.msg];
  16. }
  17. - (void)awakeFromNib {
  18. [super awakeFromNib];
  19. // Initialization code
  20. }
  21. - (void)creatUI{
  22. //预览图
  23. _chatImage=[[JXImageView alloc]initWithFrame:CGRectZero];
  24. [_chatImage setBackgroundColor:[UIColor clearColor]];
  25. _chatImage.userInteractionEnabled=YES;
  26. // _chatImage.layer.cornerRadius = 6;
  27. // _chatImage.layer.masksToBounds = YES;
  28. [self.bubbleBg addSubview:_chatImage];
  29. // [_chatImage release];
  30. _pauseBtn = [[UIButton alloc] initWithFrame:CGRectMake(0, 0, 35, 35)];
  31. _pauseBtn.center = CGPointMake(_chatImage.frame.size.width/2,_chatImage.frame.size.height/2);
  32. [_pauseBtn setBackgroundImage:[UIImage imageNamed:@"playvideo"] forState:UIControlStateNormal];
  33. // [_pauseBtn setBackgroundImage:[UIImage imageNamed:@"pausevideo"] forState:UIControlStateSelected];
  34. [_pauseBtn addTarget:self action:@selector(showTheVideo) forControlEvents:UIControlEventTouchUpInside];
  35. [_chatImage addSubview:_pauseBtn];
  36. _videoProgress = [[UILabel alloc] initWithFrame:CGRectMake(0, 0, 45, 45)];
  37. _videoProgress.center = CGPointMake(_chatImage.frame.size.width/2,_chatImage.frame.size.height/2);
  38. _videoProgress.layer.masksToBounds = YES;
  39. _videoProgress.layer.borderWidth = 2.f;
  40. _videoProgress.layer.borderColor = [UIColor whiteColor].CGColor;
  41. _videoProgress.layer.cornerRadius = _videoProgress.frame.size.width/2;
  42. _videoProgress.text = @"0%";
  43. _videoProgress.hidden = YES;
  44. _videoProgress.font = SYSFONT(13);
  45. _videoProgress.textAlignment = NSTextAlignmentCenter;
  46. _videoProgress.textColor = [UIColor whiteColor];
  47. [_chatImage addSubview:_videoProgress];
  48. }
  49. - (void)showTheVideo {
  50. if (self.videoDelegate && [self.videoDelegate respondsToSelector:@selector(showVideoPlayerWithTag:)]) {
  51. [self didVideoOpen];
  52. [self.videoDelegate showVideoPlayerWithTag:self.indexTag];
  53. }
  54. // _player= [[JXVideoPlayer alloc] initWithParent:g_App.window];
  55. // _player.didVideoOpen = @selector(didVideoOpen);
  56. // _player.didVideoPlayEnd = @selector(didVideoPlayEnd);
  57. // _player.delegate = self;
  58. // [self setUIFrame];
  59. // [_player switch];
  60. }
  61. - (void)didVideoOpen{
  62. [self.msg sendAlreadyReadMsg];
  63. if (self.msg.isGroup) {
  64. self.msg.isRead = [NSNumber numberWithInt:1];
  65. [self.msg updateIsRead:nil msgId:self.msg.messageId];
  66. }
  67. if ([self.msg.isReadDel boolValue] && !self.msg.isMySend) {
  68. [self timeGo:self.msg.fileName];
  69. }
  70. if(!self.msg.isMySend){
  71. [self drawIsRead];
  72. }
  73. }
  74. -(void)setCellData{
  75. [super setCellData];
  76. [self setUIFrame];
  77. }
  78. - (void)setUIFrame{
  79. float n = imageItemHeight;
  80. /*location_x没有值的情况下,会卡:
  81. _chatImage.image = [FileInfo getFirstImageFromVideo:self.msg.content];
  82. int w = _chatImage.image.size.width;
  83. int h = _chatImage.image.size.height;
  84. */
  85. float w = [self.msg.location_x intValue] * kScreenWidthScale;
  86. float h = [self.msg.location_y intValue];
  87. if (w <= 0 || h <= 0){
  88. w = n;
  89. h = n;
  90. }
  91. float k = w/(h/n);
  92. if(k+INSETS > JX_SCREEN_WIDTH - 80)//如果超出屏幕宽度
  93. k = JX_SCREEN_WIDTH-n-INSETS;
  94. if (self.msg.isMySend) {
  95. self.bubbleBg.frame=CGRectMake(CGRectGetMinX(self.headImage.frame)-k-CHAT_WIDTH_ICON-2, INSETS, INSETS+k, n+INSETS-4);
  96. _chatImage.frame = self.bubbleBg.bounds;
  97. }else{
  98. self.bubbleBg.frame=CGRectMake(CGRectGetMaxX(self.headImage.frame) + CHAT_WIDTH_ICON, INSETS2(self.msg.isGroup), k+INSETS, n+INSETS-4);
  99. _chatImage.frame = self.bubbleBg.bounds;
  100. }
  101. if (self.msg.isShowTime) {
  102. CGRect frame = self.bubbleBg.frame;
  103. frame.origin.y = self.bubbleBg.frame.origin.y + 40;
  104. self.bubbleBg.frame = frame;
  105. }
  106. _pauseBtn.center = CGPointMake(_chatImage.frame.size.width/2,_chatImage.frame.size.height/2);
  107. _videoProgress.center = CGPointMake(_chatImage.frame.size.width/2,_chatImage.frame.size.height/2);
  108. _chatImage.image = [UIImage imageNamed:@"Default_Gray"];
  109. if([self.msg.content rangeOfString:@"http://"].location == NSNotFound && [self.msg.content rangeOfString:@"https://"].location == NSNotFound) {
  110. [FileInfo getFirstImageFromVideo:self.msg.fileName imageView:_chatImage];
  111. }else {
  112. [FileInfo getFirstImageFromVideo:self.msg.content imageView:_chatImage];
  113. }
  114. // _player.parent = g_App.window;
  115. // if(self.msg.isMySend && isFileExist(self.msg.fileName))
  116. // _player.videoFile = self.msg.fileName;
  117. // else
  118. // _player.videoFile = self.msg.content;
  119. //音视频点击事件
  120. _chatImage.didTouch = @selector(doNotThing);
  121. [self setMaskLayer:_chatImage];
  122. if(!self.msg.isMySend)
  123. [self drawIsRead];
  124. }
  125. - (void)updateFileLoadProgress {
  126. dispatch_async(dispatch_get_main_queue(), ^{
  127. if ([self.fileDict isEqualToString:self.msg.messageId]) {
  128. _videoProgress.hidden = NO;
  129. _pauseBtn.hidden = YES;
  130. // UI更新代码
  131. if (self.loadProgress >= 1) {
  132. _videoProgress.text = [NSString stringWithFormat:@"99%@",@"%"];
  133. }else {
  134. _videoProgress.text = [NSString stringWithFormat:@"%d%@",(int)(self.loadProgress*100),@"%"];
  135. }
  136. // _videoProgress.hidden = self.loadProgress >= 1;
  137. // _pauseBtn.hidden = self.loadProgress < 1;
  138. }
  139. });
  140. }
  141. - (void)sendMessageToUser {
  142. _videoProgress.text = [NSString stringWithFormat:@"100%@",@"%"];
  143. _pauseBtn.hidden = NO;
  144. _videoProgress.hidden = YES;
  145. }
  146. //未读红点
  147. -(void)drawIsRead{
  148. if (self.msg.isMySend) {
  149. return;
  150. }
  151. if([self.msg.isRead boolValue]){
  152. self.readImage.hidden = YES;
  153. }
  154. else{
  155. if(self.readImage==nil){
  156. self.readImage=[[UIButton alloc]init];
  157. [self.contentView addSubview:self.readImage];
  158. // [self.readImage release];
  159. }
  160. [self.readImage setImage:[UIImage imageNamed:@"new_tips"] forState:UIControlStateNormal];
  161. self.readImage.hidden = NO;
  162. self.readImage.frame = CGRectMake(self.bubbleBg.frame.origin.x+self.bubbleBg.frame.size.width+7, self.bubbleBg.frame.origin.y+13, 8, 8);
  163. self.readImage.center = CGPointMake(self.readImage.center.x, self.bubbleBg.center.y);
  164. }
  165. }
  166. - (void)timeGo:(NSString *)fileName{
  167. if (_oldFileName) {
  168. if ([_oldFileName isEqualToString:fileName]) {
  169. return;
  170. }else{
  171. self.oldFileName = fileName;
  172. }
  173. }else{
  174. self.oldFileName = fileName;
  175. }
  176. if ([self.msg.timeLen intValue] <= 0) {
  177. self.msg.timeLen = [NSNumber numberWithLong:_player.player.timeLen];
  178. }
  179. //阅后即焚通知
  180. [g_notify postNotificationName:kCellReadDelNotification object:self.msg];
  181. if ([self.msg.isReadDel boolValue] && self.msg.isMySend) {
  182. [self deleteMsg];
  183. }
  184. }
  185. - (void)deleteMsg{
  186. // //播放删除动画
  187. // NSString *path = [[NSBundle mainBundle]pathForResource:@"delete.gif" ofType:nil];
  188. // //NSData *gifData = [NSData dataWithContentsOfFile:path];
  189. // CGRect webFrame;
  190. // if(self.msg.isMySend){
  191. // CGFloat webW = webWidth-self.bubbleBg.frame.size.width;
  192. // webFrame = CGRectMake(self.bubbleBg.frame.origin.x - webW, self.bubbleBg.frame.origin.y, webWidth, self.frame.size.height - self.bubbleBg.frame.origin.y);
  193. // }else{
  194. // webFrame = CGRectMake(self.bubbleBg.frame.origin.x, self.bubbleBg.frame.origin.y, webWidth, self.frame.size.height - self.bubbleBg.frame.origin.y);
  195. // }
  196. // SCGIFImageView *gifImageView = [[SCGIFImageView alloc]initWithGIFFile:path];
  197. // gifImageView.frame = webFrame;
  198. // gifImageView.userInteractionEnabled = NO;
  199. // //UIWebView *webView = [[UIWebView alloc]initWithFrame:webFrame];
  200. //
  201. // //webView.scalesPageToFit = YES;
  202. // //[webView loadData:gifData MIMEType:@"image/gif" textEncodingName:nil baseURL:nil];
  203. // //webView.backgroundColor = [UIColor clearColor];
  204. // //webView.opaque = NO;
  205. // self.bubbleBg.hidden = YES;
  206. // [self addSubview:gifImageView];
  207. // dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(2 * NSEC_PER_SEC)), dispatch_get_main_queue(), ^{
  208. // [gifImageView removeFromSuperview];
  209. // [self.delegate performSelectorOnMainThread:self.readDele withObject:self.msg waitUntilDone:NO];
  210. // self.bubbleBg.hidden = NO;
  211. // self.oldFileName = nil;
  212. // });
  213. // if (!_isEndVideo) {
  214. // return;
  215. // }
  216. if (![self.msg.isReadDel boolValue]) {
  217. return;
  218. }
  219. //渐变隐藏
  220. [UIView animateWithDuration:2.f animations:^{
  221. self.bubbleBg.alpha = 0;
  222. self.chatImage.alpha = 0;
  223. self.readImage.alpha = 0;
  224. self.burnImage.alpha = 0;
  225. } completion:^(BOOL finished) {
  226. //动画结束后删除UI
  227. if(self.delegate != nil && [self.delegate respondsToSelector:self.readDele]){
  228. [self.delegate performSelectorOnMainThread:self.readDele withObject:self.msg waitUntilDone:NO];
  229. }
  230. self.bubbleBg.alpha = 1;
  231. self.chatImage.alpha = 1;
  232. self.readImage.alpha = 1;
  233. self.burnImage.alpha = 1;
  234. self.oldFileName = nil;
  235. }];
  236. }
  237. + (float)getChatCellHeight:(JXMessageObject *)msg {
  238. if ([msg.chatMsgHeight floatValue] > 1) {
  239. return [msg.chatMsgHeight floatValue];
  240. }
  241. float n = 0;
  242. if (msg.isGroup && !msg.isMySend) {
  243. if (msg.isShowTime) {
  244. n = imageItemHeight+20*2 + 40;
  245. }else {
  246. n = imageItemHeight+20*2;
  247. }
  248. n += GROUP_CHAT_INSET;
  249. }else {
  250. if (msg.isShowTime) {
  251. n = imageItemHeight+10*2 + 40;
  252. }else {
  253. n = imageItemHeight+10*2;
  254. }
  255. }
  256. msg.chatMsgHeight = [NSString stringWithFormat:@"%f",n];
  257. if (!msg.isNotUpdateHeight) {
  258. [msg updateChatMsgHeight];
  259. }
  260. return n;
  261. }
  262. @end