// // NSString+Message.m // TLChat // // Created by 李伯坤 on 16/3/15. // Copyright © 2016年 李伯坤. All rights reserved. // #import "NSString+Message.h" #import "TLExpressionHelper.h" @implementation NSString (Message) - (NSAttributedString *)toMessageString; { //1、创建一个可变的属性字符串 NSMutableAttributedString *attributeString = [[NSMutableAttributedString alloc] initWithString:self]; [attributeString addAttribute:NSFontAttributeName value:[UIFont fontTextMessageText] range:NSMakeRange(0, self.length)]; //2、通过正则表达式来匹配字符串 NSString *regex_emoji = @"\\[[a-zA-Z0-9\\/\\u4e00-\\u9fa5]+\\]"; //匹配表情 NSError *error = nil; NSRegularExpression *re = [NSRegularExpression regularExpressionWithPattern:regex_emoji options:NSRegularExpressionCaseInsensitive error:&error]; if (!re) { NSLog(@"[NSString toMessageString]: %@", [error localizedDescription]); return attributeString; } NSArray *resultArray = [re matchesInString:self options:0 range:NSMakeRange(0, self.length)]; //3、获取所有的表情以及位置 //用来存放字典,字典中存储的是图片和图片对应的位置 NSMutableArray *imageArray = [NSMutableArray arrayWithCapacity:resultArray.count]; //根据匹配范围来用图片进行相应的替换 for(NSTextCheckingResult *match in resultArray) { //获取数组元素中得到range NSRange range = [match range]; //获取原字符串中对应的值 NSString *subStr = [self substringWithRange:range]; TLExpressionGroupModel *group = [[TLExpressionHelper sharedHelper] defaultFaceGroup]; for (TLExpressionModel *emoji in group.data) { if ([emoji.name isEqualToString:subStr]) { //face[i][@"png"]就是我们要加载的图片 //新建文字附件来存放我们的图片,iOS7才新加的对象 NSTextAttachment *textAttachment = [[NSTextAttachment alloc] init]; //给附件添加图片 textAttachment.image = [UIImage imageNamed:emoji.name]; //调整一下图片的位置,如果你的图片偏上或者偏下,调整一下bounds的y值即可 textAttachment.bounds = CGRectMake(0, -4, 20, 20); //把附件转换成可变字符串,用于替换掉源字符串中的表情文字 NSAttributedString *imageStr = [NSAttributedString attributedStringWithAttachment:textAttachment]; //把图片和图片对应的位置存入字典中 NSMutableDictionary *imageDic = [NSMutableDictionary dictionaryWithCapacity:2]; [imageDic setObject:imageStr forKey:@"image"]; [imageDic setObject:[NSValue valueWithRange:range] forKey:@"range"]; //把字典存入数组中 [imageArray addObject:imageDic]; } } } //4、从后往前替换,否则会引起位置问题 for (int i = (int)imageArray.count -1; i >= 0; i--) { NSRange range; [imageArray[i][@"range"] getValue:&range]; //进行替换 [attributeString replaceCharactersInRange:range withAttributedString:imageArray[i][@"image"]]; } return attributeString; } @end