[代码] 类似 YYText 将表情文本转换成表情字符
2016-03-23 16:38
218 查看
一,经历
1> 由于工作需要,得把 UITextView 中的属性文本转换成普通文字,并将处理后的普通文字转换成属性文本.
2> 将属性文本转换成普通文字简单,可以调用属性文本的enumerateAttribute:inRange:options:usingBlock:方法.
3> 如何将普通文字中的表情符号[:xx]转换成显示的表情呢?这是一个很麻烦的过程,先贴上我研究了三四个小时的代码.
4> 一开始没想到用双层循环,但是单层循环只会遍历一次表情字符串,如果文本中有多个表情字符串,就会漏掉,因此必须使用双层循环,外层用找到[:作为循环终止条件,内层用没有[:作为跳出跳出条件.
5> 后来漏掉了包含[:但是不是表情字符串的情况,因此我就需要加一个 bool 变量,当遍历一次所有表情字符串,没有找到就让该变量置为 NO, 然后跳出第二层循环,排除有[:但是没有表情包的情况.
1> 由于工作需要,得把 UITextView 中的属性文本转换成普通文字,并将处理后的普通文字转换成属性文本.
2> 将属性文本转换成普通文字简单,可以调用属性文本的enumerateAttribute:inRange:options:usingBlock:方法.
3> 如何将普通文字中的表情符号[:xx]转换成显示的表情呢?这是一个很麻烦的过程,先贴上我研究了三四个小时的代码.
-(NSMutableAttributedString *)EmojiTextInTextView:(NSString*)text { NSMutableAttributedString *emojiText = [[NSMutableAttributedString alloc]initWithString:text]; NSArray *keys = [self.emojiManager.dictAllEmoji allKeys]; // 若存在[:就遍历所有的表情 do { BOOL bFindEmoji = NO; for (id key in keys) { // 有表情 if ([text rangeOfString:key].location != NSNotFound) { bFindEmoji = YES; // 模拟属性字符串,使用普通文本占领表情位置,方便确定表情位置 NSRange range = [text rangeOfString:key]; text = [text stringByReplacingCharactersInRange:range withString:@"1"]; // 转换成表情图片 UIImage *img = self.emojiManager.dictAllEmoji[key]; EmojiTextAttachment *attach = [[EmojiTextAttachment alloc]initWithData:nil ofType:nil]; if(img) attach.image = img; attach.emojiTag = key; NSAttributedString *replaceAttri = [NSAttributedString attributedStringWithAttachment:attach]; [emojiText replaceCharactersInRange:range withAttributedString:replaceAttri]; if ([text rangeOfString:@"[:"].location == NSNotFound){ break; } } } // 若没有查找到一个表情,就退出 if (bFindEmoji == NO) { break; } else { bFindEmoji = NO; } }while ([text rangeOfString:@"[:"].location != NSNotFound); return emojiText; }
4> 一开始没想到用双层循环,但是单层循环只会遍历一次表情字符串,如果文本中有多个表情字符串,就会漏掉,因此必须使用双层循环,外层用找到[:作为循环终止条件,内层用没有[:作为跳出跳出条件.
5> 后来漏掉了包含[:但是不是表情字符串的情况,因此我就需要加一个 bool 变量,当遍历一次所有表情字符串,没有找到就让该变量置为 NO, 然后跳出第二层循环,排除有[:但是没有表情包的情况.
相关文章推荐
- C#时间格式转换、日期操作函数、常用转换语法
- 礼拜三log~关于c:test标签 & js鼠标变身! & java字符串相关函数
- 不认识spring xml配置文件dtd和xsd类型,血与泪的教训啊
- 汇编程序与编译程序区别 assembler compiler
- c# 调用 dephi 字符串传输
- C# 如何使用ajax
- PHP extract() 函数
- java remote debug parameters
- 《C++ Primer》学习 之 函数指针相关用法
- C#随机数
- struts学习之HelloWorld
- 昨天晚上写了个 Python 程序,下载了一个福利网站 5000 来张妹子图片
- ASP.NET会话丢失,Session超时配置
- C/C++位运算技巧
- 使用google、firefox、360浏览器的过程中遇到的问题及解决办法
- 安装 Laravel 出问题了?你可能需要修改 composer.json 文件
- C语言冒泡选择排序
- java中XML 数字签名的标准
- (java)求证一个链表是否是回文的。
- Spring Resource(针对于资源文件的统一接口)