74 lines
3.3 KiB
Objective-C
74 lines
3.3 KiB
Objective-C
//
|
|
// 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
|