CYFriendyTableViewCell.m 20 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514
  1. //
  2. // CYFriendyTableViewCell.m
  3. // shiku_im
  4. //
  5. // Created by Ron on 2019/11/24.
  6. // Copyright © 2019 Reese. All rights reserved.
  7. //
  8. #import "CYFriendyTableViewCell.h"
  9. #import "JXLabel.h"
  10. #import "JXImageView.h"
  11. #import "AppDelegate.h"
  12. @implementation CYFriendyTableViewCell
  13. @synthesize title,bottomTitle,headImage,bage,userId;
  14. @synthesize index,delegate,didTouch,lbTitle,lbBottomTitle,lbSubTitle;
  15. - (id)initWithStyle:(UITableViewCellStyle)style reuseIdentifier:(NSString *)reuseIdentifier
  16. {
  17. self = [super initWithStyle:style reuseIdentifier:reuseIdentifier];
  18. if(self){
  19. self.selectionStyle = UITableViewCellSelectionStyleBlue;
  20. //内容
  21. UIFont* f0 = [UIFont systemFontOfSize:14];
  22. //名称
  23. UIFont * f1 = [UIFont systemFontOfSize:16];
  24. //时间
  25. UIFont* timeFont = [UIFont systemFontOfSize:13];
  26. int n = 64;
  27. UIView* v = [[UIView alloc]initWithFrame:CGRectMake(0,0, JX_SCREEN_WIDTH, n)];
  28. v.backgroundColor = [UIColor colorWithRed:0.9 green:0.9 blue:0.9 alpha:1];
  29. self.selectedBackgroundView = v;
  30. self.lineView = [[UIView alloc]initWithFrame:CGRectMake(SEPSRATOR_WIDTH,n-0.5,JX_SCREEN_WIDTH,0.5)];
  31. self.lineView.backgroundColor = [UIColor colorWithRed:0.9 green:0.9 blue:0.9 alpha:1];
  32. [self.contentView addSubview:self.lineView];
  33. _delBtn = [[UIButton alloc] initWithFrame:CGRectMake(10, 22, 20, 20)];
  34. [_delBtn setBackgroundImage:[UIImage imageNamed:@"delete"] forState:UIControlStateNormal];
  35. [_delBtn addTarget:self action:@selector(delBtnAction:) forControlEvents:UIControlEventTouchUpInside];
  36. _delBtn.hidden = YES;
  37. [self.contentView addSubview:_delBtn];
  38. _headImageView = [[JXImageView alloc]init];
  39. _headImageView.userInteractionEnabled = NO;
  40. _headImageView.tag = index;
  41. _headImageView.delegate = self;
  42. _headImageView.didTouch = @selector(headImageDidTouch);
  43. _headImageView.frame = CGRectMake(14,5,52,52);
  44. _headImageView.layer.cornerRadius = 25;
  45. _headImageView.layer.masksToBounds = YES;
  46. // _headImageView.layer.borderWidth = 0.5;
  47. _headImageView.layer.borderColor = [UIColor darkGrayColor].CGColor;
  48. [self.contentView addSubview:self.headImageView];
  49. [g_notify addObserver:self selector:@selector(headImageNotification:) name:kGroupHeadImageModifyNotifaction object:nil];
  50. // if(headImage){
  51. // if([headImage rangeOfString:@"http://"].location == NSNotFound)
  52. // self.headImageView.image = [UIImage imageNamed:headImage];
  53. // else
  54. // [g_server getImage:headImage imageView:self.headImageView];
  55. // }
  56. // [g_server getHeadImageSmall:userId userName:self.title imageView:self.headImageView];
  57. //昵称Label
  58. JXLabel* lb;
  59. lb = [[JXLabel alloc] initWithFrame:CGRectMake(CGRectGetMaxX(_headImageView.frame)+14, 10, JX_SCREEN_WIDTH - 115 -CGRectGetMaxX(_headImageView.frame)-14, 14)];
  60. lb.textColor = HEXCOLOR(0x323232);
  61. lb.userInteractionEnabled = NO;
  62. lb.backgroundColor = [UIColor clearColor];
  63. lb.font = f1;
  64. lb.tag = self.index;
  65. // lb.delegate = self.delegate;
  66. // lb.didTouch = self.didTouch;
  67. [self.contentView addSubview:lb];
  68. // [lb release];
  69. [lb setText:self.title];
  70. self.lbTitle = lb;
  71. _positionLabel = [UIFactory createLabelWith:CGRectMake(CGRectGetMaxX(self.lbTitle.frame)+2, CGRectGetMinY(self.lbTitle.frame), 20, 20) text:@"" font:g_factory.font11 textColor:[UIColor whiteColor] backgroundColor:nil];
  72. _positionLabel.layer.backgroundColor = [UIColor orangeColor].CGColor;
  73. _positionLabel.layer.cornerRadius = 5;
  74. _positionLabel.textAlignment = NSTextAlignmentCenter;
  75. _positionLabel.hidden = YES;
  76. [self.contentView addSubview:_positionLabel];
  77. if (self.positionTitle.length > 0){
  78. self.positionTitle = self.positionTitle;
  79. }
  80. //聊天消息Label
  81. lb = [[JXLabel alloc]initWithFrame:CGRectMake(CGRectGetMaxX(_headImageView.frame)+14, CGRectGetMaxY(self.lbTitle.frame)+10, JX_SCREEN_WIDTH-86-50, 16)];
  82. lb.textColor = [UIColor lightGrayColor];
  83. lb.userInteractionEnabled = NO;
  84. lb.backgroundColor = [UIColor clearColor];
  85. lb.font = f0;
  86. [self.contentView addSubview:lb];
  87. // [lb release];
  88. [lb setText:self.subtitle];
  89. self.lbSubTitle = lb;
  90. //时间Label
  91. self.timeLabel = [[JXLabel alloc]initWithFrame:CGRectMake(JX_SCREEN_WIDTH - 120, 13, 115, 20)];
  92. self.timeLabel.textColor = [UIColor lightGrayColor];
  93. self.timeLabel.userInteractionEnabled = NO;
  94. self.timeLabel.backgroundColor = [UIColor clearColor];
  95. self.timeLabel.textAlignment = NSTextAlignmentRight;
  96. self.timeLabel.font = timeFont;
  97. [self.contentView addSubview:self.timeLabel];
  98. // [self.timeLabel release];
  99. [self.timeLabel setText:self.bottomTitle];
  100. self.lbBottomTitle = self.timeLabel;
  101. //快捷回复
  102. self.replayView = [[JXImageView alloc] initWithFrame:CGRectMake(JX_SCREEN_WIDTH-25-20, 64-25-20-6, 45, 45)];
  103. self.replayView.hidden = YES;
  104. self.replayView.didTouch = @selector(didQuickReply);
  105. self.replayView.delegate = self;
  106. [self.contentView addSubview:self.replayView];
  107. _replayImgV = [[UIImageView alloc] initWithFrame:CGRectMake(45-25, 45-25, 15, 15)];
  108. _replayImgV.image = [UIImage imageNamed:@"msg_replay_icon"];
  109. [self.replayView addSubview:_replayImgV];
  110. //免打扰图标
  111. self.notPushImageView = [[JXImageView alloc] initWithFrame:CGRectMake(JX_SCREEN_WIDTH-25-15-10, 64-25-6, 15, 15)];
  112. self.notPushImageView.image = [UIImage imageNamed:@"msg_not_push"];
  113. self.notPushImageView.hidden = YES;
  114. [self.contentView addSubview:self.notPushImageView];
  115. // _bageNumber = [[JXBadgeView alloc] initWithFrame:CGRectMake(45-27, 45-25, 20, 20)];
  116. // _bageNumber.delegate = delegate;
  117. // _bageNumber.didDragout = self.didDragout;
  118. // _bageNumber.userInteractionEnabled = YES;
  119. // _bageNumber.lb.font = SYSFONT(12);
  120. // [self.replayView addSubview:_bageNumber];
  121. //特别关心图标
  122. self.specialCareImageView = [[JXImageView alloc] initWithFrame:CGRectMake(JX_SCREEN_WIDTH-25-15-10, 20, 15, 15)];
  123. self.specialCareImageView.image = [UIImage imageNamed:@"collection_me"];
  124. self.specialCareImageView.hidden = YES;
  125. [self.contentView addSubview:self.specialCareImageView];
  126. // [self.replayView addSubview:_bageNumber];
  127. UITapGestureRecognizer *tap = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(didQuickReply)];
  128. // [_bageNumber addGestureRecognizer:tap];
  129. // [bageNumber release];
  130. self.bage = bage;
  131. // [self saveBadge:bage withTitle:self.title];
  132. }
  133. return self;
  134. }
  135. - (void)delBtnAction:(UIButton *)btn {
  136. if (self.delegate && [self.delegate respondsToSelector:self.didDelMsg]) {
  137. [self.delegate performSelectorOnMainThread:self.didDelMsg withObject:self waitUntilDone:YES];
  138. }
  139. }
  140. -(void)dealloc{
  141. // NSLog(@"JXCell.dealloc");
  142. // [self.bageDict removeAllObjects];
  143. // self.bageDict = nil;
  144. [g_notify removeObserver:self name:kGroupHeadImageModifyNotifaction object:nil];
  145. self.title = nil;
  146. self.subtitle = nil;
  147. self.bottomTitle = nil;
  148. self.headImage = nil;
  149. self.bage = nil;
  150. self.userId = nil;
  151. self.lbSubTitle = nil;
  152. self.lbTitle = nil;
  153. self.lbBottomTitle = nil;
  154. // self.bageDict = nil;
  155. // [_headImageView release];
  156. // [super dealloc];
  157. }
  158. - (void)setIsNotPush:(BOOL)isNotPush {
  159. _isNotPush = isNotPush;
  160. self.notPushImageView.hidden = !isNotPush;
  161. }
  162. - (void)setIsMsgVCCome:(BOOL)isMsgVCCome { // 只有JXMsgViewController显示回复按钮
  163. _isMsgVCCome = isMsgVCCome;
  164. self.replayView.hidden = !isMsgVCCome;
  165. // 这里获取需要userid 一定要在cell赋值userid 之后再调用
  166. //
  167. _replayImgV.alpha = 1-([self.userId intValue] == [SHIKU_TRANSFER intValue]);
  168. }
  169. - (void)didQuickReply {
  170. if ([self.userId intValue] == [SHIKU_TRANSFER intValue]) {
  171. return;
  172. }
  173. if (self.delegate && [self.delegate respondsToSelector:self.didReplay]) {
  174. [self.delegate performSelectorOnMainThread:self.didReplay withObject:self waitUntilDone:YES];
  175. }
  176. }
  177. //将所有Cell的badge存到沙盒里
  178. //- (void)saveBadge:(NSString*)badg withTitle:(NSString*)titl{
  179. //
  180. // if (bage == nil || titl == nil) {
  181. // return;
  182. // }
  183. // NSArray * path = NSSearchPathForDirectoriesInDomains(NSCachesDirectory, NSUserDomainMask, YES);
  184. // NSString * cacherDir = [[path objectAtIndex:0] stringByAppendingPathComponent:@"cellBage.txt"];
  185. //
  186. // NSData * data = [[NSData alloc]initWithContentsOfFile:cacherDir];
  187. //
  188. // NSKeyedUnarchiver * unarchiver = [[NSKeyedUnarchiver alloc]initForReadingWithData:data];
  189. //
  190. // self.bageDict = [unarchiver decodeObjectForKey:@"dict"];
  191. //
  192. // if (self.bageDict == nil) {
  193. // self.bageDict = [[NSMutableDictionary alloc]init];
  194. // }
  195. //
  196. // [self.bageDict setObject:badg forKey:titl];
  197. //
  198. // NSMutableData * muData = [[NSMutableData alloc]init];
  199. //
  200. // NSKeyedArchiver * archiver = [[NSKeyedArchiver alloc]initForWritingWithMutableData:muData];
  201. //
  202. // [archiver encodeObject:self.bageDict forKey:@"dict"];
  203. //
  204. // [archiver finishEncoding];
  205. //
  206. // [muData writeToFile:cacherDir atomically:YES];
  207. //}
  208. //- (void)awakeFromNib
  209. //{
  210. // // Initialization code
  211. //}
  212. - (void)setSelected:(BOOL)selected animated:(BOOL)animated
  213. {
  214. [super setSelected:selected animated:animated];
  215. // Configure the view for the selected state
  216. }
  217. -(void)headImageDidTouch{
  218. if (self.delegate && [self.delegate respondsToSelector:didTouch]) {
  219. [self.delegate performSelectorOnMainThread:didTouch withObject:self.dataObj waitUntilDone:YES];
  220. }
  221. }
  222. - (void)getHeadImage{
  223. if(headImage){
  224. if([headImage rangeOfString:@"http://"].location == NSNotFound)
  225. self.headImageView.image = [UIImage imageNamed:headImage];
  226. else
  227. [g_server getImage:headImage imageView:self.headImageView];
  228. }
  229. [g_server getHeadImageSmall:userId userName:self.title imageView:self.headImageView];
  230. }
  231. -(void)setBage:(NSString *)s{
  232. /*
  233. // bageNumber.hidden = [s intValue]<=0;
  234. _replayImgV.hidden = [s intValue] > 0;
  235. _bageNumber.badgeString = s;
  236. if ([s intValue] >= 10 && [s intValue] <= 99) {
  237. _bageNumber.lb.font = SYSFONT(12);
  238. }else if ([s intValue] > 0 && [s intValue] < 10) {
  239. _bageNumber.lb.font = SYSFONT(13);
  240. }else if([s intValue] > 99){
  241. _bageNumber.lb.font = SYSFONT(9);
  242. }
  243. bage = s;
  244. */
  245. }
  246. -(void)setForTimeLabel:(NSString *)s{
  247. self.bottomTitle = s;
  248. // self.bottomTitle = [s retain];
  249. self.timeLabel.text = s;
  250. }
  251. -(void)setTitle:(NSString *)s{
  252. // title = [s retain];
  253. title = s;
  254. self.lbTitle.text = s;
  255. }
  256. -(void)setPositionTitle:(NSString *)positionTitle{
  257. _positionTitle = positionTitle;
  258. if (positionTitle.length > 0) {
  259. _positionLabel.text = positionTitle;
  260. _positionLabel.hidden = NO;
  261. CGSize positionSize =[positionTitle sizeWithAttributes:@{NSFontAttributeName:[UIFont systemFontOfSize:11]}];
  262. if (positionSize.width >150)
  263. positionSize.width = 150;
  264. CGSize titleSize = [self.lbTitle.text sizeWithAttributes:@{NSFontAttributeName: self.lbTitle.font}];
  265. _positionLabel.frame = CGRectMake(self.lbTitle.frame.origin.x + titleSize.width + 2, CGRectGetMinY(self.lbTitle.frame) + 5, positionSize.width+4, positionSize.height);
  266. _positionLabel.center = CGPointMake(_positionLabel.center.x, 54 / 2);
  267. }
  268. }
  269. - (void)setSuLabel:(NSString *)s{
  270. // subtitle = [s retain];
  271. _subtitle = s;
  272. self.lbSubTitle.attributedText = [self setContentLabelStr:s];
  273. }
  274. -(void)setSubtitle:(NSString *)subtitle{
  275. _subtitle = subtitle;
  276. self.lbSubTitle.attributedText = [self setContentLabelStr:subtitle];
  277. }
  278. - (void)getMessageRange:(NSString*)message :(NSMutableArray*)array {
  279. NSRange range=[message rangeOfString: @"["];
  280. NSRange range1=[message rangeOfString: @"]"];
  281. // 动画过滤
  282. if ([message isEqualToString:[NSString stringWithFormat:@"[%@]",Localized(@"emojiVC_Emoji")]]) {
  283. [array addObject:message];
  284. return;
  285. }
  286. //判断当前字符串是否还有表情的标志。
  287. if (range.length>0 && range1.length>0 && range1.location > range.location) {
  288. if (range.location > 0) {
  289. [array addObject:[message substringToIndex:range.location]];
  290. [array addObject:[message substringWithRange:NSMakeRange(range.location, range1.location+1-range.location)]];
  291. NSString *str=[message substringFromIndex:range1.location+1];
  292. [self getMessageRange:str :array];
  293. }else {
  294. NSString *nextstr=[message substringWithRange:NSMakeRange(range.location, range1.location+1-range.location)];
  295. //排除文字是“”的
  296. if (![nextstr isEqualToString:@""]) {
  297. [array addObject:nextstr];
  298. NSString *str=[message substringFromIndex:range1.location+1];
  299. [self getMessageRange:str :array];
  300. }else {
  301. return;
  302. }
  303. }
  304. } else if (message != nil) {
  305. [array addObject:message];
  306. }
  307. }
  308. - (NSAttributedString *) setContentLabelStr:(NSString *) str {
  309. NSMutableArray *contentArray = [NSMutableArray array];
  310. [self getMessageRange:str :contentArray];
  311. NSMutableAttributedString *strM = [[NSMutableAttributedString alloc] init];
  312. NSInteger count = contentArray.count;
  313. if (contentArray.count > 15) {
  314. count = 15;
  315. }
  316. for (NSInteger i = 0; i < count; i ++) {
  317. NSString *object = contentArray[i];
  318. // NSLog(@"%@",object);
  319. BOOL flag = NO;
  320. if ([object hasSuffix:@"]"]&&[object hasPrefix:@"["]) {
  321. //如果是表情用iOS中附件代替string在label上显示
  322. NSTextAttachment *imageStr = [[NSTextAttachment alloc]init];
  323. NSString *imageShortName = [object substringWithRange:NSMakeRange(1, object.length - 2)];
  324. for (NSInteger i = 0; i < g_constant.emojiArray.count; i ++) {
  325. NSDictionary *dict = g_constant.emojiArray[i];
  326. NSString *imageName = dict[@"english"];
  327. if ([imageName isEqualToString:imageShortName]) {
  328. imageStr.image = [UIImage imageNamed:dict[@"filename"]];
  329. flag = YES;
  330. break;
  331. }
  332. }
  333. if (!flag) {
  334. [strM appendAttributedString:[[NSAttributedString alloc] initWithString:object]];
  335. NSRange range = [object rangeOfString:Localized(@"JX_Draft")];
  336. [strM addAttribute:NSForegroundColorAttributeName value:[UIColor redColor] range:range];
  337. range = [object rangeOfString:Localized(@"JX_Someone@Me")];
  338. [strM addAttribute:NSForegroundColorAttributeName value:[UIColor redColor] range:range];
  339. continue;
  340. }
  341. // imageStr.image = [UIImage imageNamed:[object substringWithRange:NSMakeRange(1, object.length - 2)]];
  342. //这里对图片的大小进行设置一般来说等于文字的高度
  343. CGFloat height = self.lbSubTitle.font.lineHeight + 1;
  344. imageStr.bounds = CGRectMake(0, -4, height, height);
  345. NSAttributedString *attrString = [NSAttributedString attributedStringWithAttachment:imageStr];
  346. [strM appendAttributedString:attrString];
  347. }else{
  348. //如果不是表情直接进行拼接
  349. [strM appendAttributedString:[[NSAttributedString alloc] initWithString:object]];
  350. NSRange range = [object rangeOfString:Localized(@"JX_Draft")];
  351. [strM addAttribute:NSForegroundColorAttributeName value:[UIColor redColor] range:range];
  352. range = [object rangeOfString:Localized(@"JX_Someone@Me")];
  353. [strM addAttribute:NSForegroundColorAttributeName value:[UIColor redColor] range:range];
  354. }
  355. }
  356. return strM;
  357. }
  358. -(void)headImageNotification:(NSNotification *)notification{
  359. NSDictionary * groupDict = notification.object;
  360. NSString * roomJid = groupDict[@"roomJid"];
  361. if ([roomJid isEqualToString:self.userId]) {
  362. UIImage * hImage = groupDict[@"groupHeadImage"];
  363. self.headImageView.image = hImage;
  364. }
  365. }
  366. -(void)headImageViewImageWithUserId:(NSString *)userId roomId:(NSString *)roomIdStr {
  367. if (roomIdStr != nil) {
  368. // if (![g_server getRoomHeadImageSmall:self.userId imageView:self.headImageView]) {
  369. // NSString *groupImagePath = [NSString stringWithFormat:@"%@%@/%@.%@",NSTemporaryDirectory(),g_myself.userId,roomIdStr,@"jpg"];
  370. // if (groupImagePath && [[NSFileManager defaultManager] fileExistsAtPath:groupImagePath]) {
  371. // self.headImageView.image = [UIImage imageWithContentsOfFile:groupImagePath];
  372. // }else{
  373. // [roomData roomHeadImageRoomId:roomIdStr toView:self.headImageView];
  374. // }
  375. [g_server getRoomHeadImageSmall:userId roomId:roomIdStr imageView:self.headImageView];
  376. // }
  377. }else{
  378. if(headImage){
  379. if([headImage rangeOfString:@"http://"].location == NSNotFound)
  380. self.headImageView.image = [UIImage imageNamed:headImage];
  381. else
  382. [g_server getImage:headImage imageView:self.headImageView];
  383. }
  384. [g_server getHeadImageSmall:self.userId userName:self.title imageView:self.headImageView];
  385. }
  386. }
  387. - (void)setIsSmall:(BOOL)isSmall {
  388. _isSmall = isSmall;
  389. CGFloat headX = 14;
  390. self.delBtn.hidden = YES;
  391. if (self.isEdit) {
  392. self.delBtn.hidden = NO;
  393. headX = CGRectGetMaxX(_delBtn.frame) + 10;
  394. }
  395. if (!isSmall) {
  396. _headImageView.frame = CGRectMake(headX,5,52,52);
  397. self.lbTitle.frame = CGRectMake(CGRectGetMaxX(_headImageView.frame)+14, 13, JX_SCREEN_WIDTH - 100 -CGRectGetMaxX(_headImageView.frame)-14, 18);
  398. self.lbSubTitle.frame = CGRectMake(CGRectGetMaxX(_headImageView.frame)+14, self.lbSubTitle.frame.origin.y, JX_SCREEN_WIDTH - 55 -CGRectGetMaxX(_headImageView.frame)-14, self.lbSubTitle.frame.size.height);
  399. self.lineView.frame = CGRectMake(CGRectGetMaxX(_headImageView.frame)+14,64-0.5,JX_SCREEN_WIDTH,0.5);
  400. }else {
  401. _headImageView.frame = CGRectMake(headX,5,42,42);
  402. _headImageView.layer.cornerRadius = _headImageView.frame.size.width / 2;
  403. self.lbTitle.frame = CGRectMake(CGRectGetMaxX(_headImageView.frame)+14, 10, JX_SCREEN_WIDTH - 100 -CGRectGetMaxX(_headImageView.frame)-14, 54 - 20);
  404. self.lbSubTitle.frame = CGRectMake(CGRectGetMaxX(_headImageView.frame)+14, self.lbSubTitle.frame.origin.y, JX_SCREEN_WIDTH - 55 -CGRectGetMaxX(_headImageView.frame)-14, self.lbSubTitle.frame.size.height);
  405. self.lineView.frame = CGRectMake(CGRectGetMaxX(_headImageView.frame)+14,54-0.5,JX_SCREEN_WIDTH,0.5);
  406. }
  407. }
  408. @end