[代码] 类似 YYText 将表情文本转换成表情字符
一,经历
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:@""]; // 转换成表情图片
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, 然后跳出第二层循环,排除有[:但是没有表情包的情况.
[代码] 类似 YYText 将表情文本转换成表情字符的更多相关文章
- java字符串转义,把<>转换成<>等字符【原】
java字符串转义,把<>转换成<>等字符 使用的是commons-lang3-3.4 中的StringEscapeUtils类 package test; import ja ...
- html 实体编码转换成原字符
今天遇到件很恶心的事,某国外歌词网站提供的歌词在源文件里使用“&#数字;”格式的编码表示abcd....原来小菜我实在才疏学浅不知此为何物,于是特有的搜索引擎控,搜之.片刻得解,此乃html实 ...
- Base64字符保存图片,图片转换成Base64字符编码
//文件转换成Base64编码 public static String getFileBase64Str(String filePath) throws IOException { String f ...
- java把html标签字符转换成普通字符(反转换成html标签)
package net.jasonjiang.web; import org.junit.Test; import org.springframework.web.util.HtmlUtils; /* ...
- Python 将文本转换成html的简单示例
实例txt文件test_input.txt: Welcome to World Wide Spam. Inc. These are the corporate web pages of *World ...
- MVC 文本转换成html显示
最近在学习ASP.NET MVC,项目中需要将后台传输的HTML文本在前台页面显示:@Html.Raw(HttpUtility.HtmlDecode(ViewBag.DisplayText)).记下来 ...
- MFC中将编辑框文本转换成整数,从而实现两个整数相加。
在头文件中,定义三个控件变量,如m_data1,m_data2,m_sum; void Cuse_demo_dllDlg::OnBnClickedButton1(){ CString data1; C ...
- awk将普通文本转换成json文件
script1: #!/bin/bash #Date:-- #Author:eivll0m awk -F"\t" -vq='"' '{ a[$]=a[$]?a[$]:$ ...
- powershell 将文本转换成表格的还有一种方式
$text=" 1 梦幻西游 216406 2014-01-21 资料片 2 炉石传说 15905 2014-01-24 公測 3 新大话西游 214465 2002-08-01 公測 4 ...
随机推荐
- ZooKeeper 的羊群效应
一个需要避免的问题是当一个特定的znode 改变的时候ZooKeper 触发了所有watches 的事件. 举个例子,如果有1000个客户端watch 一个znode的exists调用,当这个节点被创 ...
- Oracle RMAN备份策略
建立增量备份:如果数据库运行于不归档模式下,只能在数据库干净关闭的情况下 ( 以 normal .immediate . transactional 方式关闭 ) 才能进行一致性的增量备份,如果数据库 ...
- 向Word模板中填充数据
现在有这样的需求,给Word文档的指定位置填充上特定数据,例如我们有一个终端,用来打印员工的薪资证明,对于一个公司来说,他的薪资证明模板是固定的,变化的地方是员工姓名,部门,职位等.我们只需要将这些指 ...
- WINDOWS系统Eclipse+NDK+Android + OpenCv
WINDOWS系统Eclipse+NDK+Android + OpenCv 参考文档博客 1 NDK环境搭建 http://jingyan.baidu.com/article/5d6edee22d90 ...
- HDU 3586 Information Disturbing 树形DP+二分
Information Disturbing Problem Description In the battlefield , an effective way to defeat enemies ...
- 【Tomcat】直接启动tomcat时为tomcat指定JDK 而不是读取环境变量中的配置
在windows环境下以批处理文件方式启动tomcat,只要运行<CATALINA_HOME>/bin/startup.bat这个文件,就可以启动Tomcat.在启动时,startup.b ...
- android MPAndroidChart饼图实现图例后加数字或文本(定制图例)
转载请注明:http://blog.csdn.net/ly20116/article/details/50905789 MPAndroidChart是一个非常优秀的开源图表库,MPAndroidCha ...
- Liferay 6.2 改造系列之一:源码编译和服务启动
一.导入源码 源码可以从Liferay的官方网站上下载.http://www.liferay.com/downloads/liferay-portal/available-releases 下载后解压 ...
- win7,vs2010,asp.net项目中修改外部js文件,在调试时加载的还是旧文件
win7,vs2010,asp.net项目中修改外部js文件,在调试时加载的还是旧文件 我杀过 w3wp.exe和asp.net_state的进程,重启 iis admin的服务,都还是不行. 只是把 ...
- Codeforces Round #375 (Div. 2) - A
题目链接:http://codeforces.com/contest/723/problem/A 题意:在一维坐标下有3个人(坐标点).他们想选一个点使得他们3个到这个点的距离之和最小. 思路:水题. ...