[代码] 类似 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 ...
随机推荐
- annotation-config 和 component-scan 的区别
<context:annotation-config> 和 <context:component-scan>是Spring Core里面的两个基础概念,每个使用者都有必要理解怎 ...
- 6-03使用SQL语句一次型向表中插入多行数据
通过将现有表中的数据添加到已存在的表中: INSERT INTO <表名><列名> SELECT<列名> FROM<源表名> 将UserInfo的数据添 ...
- 提供给Android和iOS开发人员的UWP移植向导
(此文章同时发表在本人微信公众号"dotNET每日精华文章",欢迎右边二维码来关注.) 题记:前几天微软发布了一个针对Android和iOS开发人员理解Windows Apps概念 ...
- AIX下禁止crs随ha启动而启动
/etc/init.crs enable /etc/init.crs disable 查看目前crs是enable还是disable状态 状态记录在一个文本文件里 /etc/oracle/scls_ ...
- Eclipse·如何关联Git库文件和添加JUint库
Eclipse创建工程并关联到文件(SVN或Git管理的代码文件) 新建java工程,用于存放工程的一些信息,默认存放地址. 工程相关的信息是不需要提交到(SVN或Git)版本库的,所以工程存放到本地 ...
- canvas加载进度条
<!DOCTYPE html> <html><head><meta http-equiv="Content-Type" content=& ...
- loadrunner实现字符串的替换
char *replace_str(char *str, char *orig, char *rep) { static char buffer[9096]; char *p; i ...
- BootSrap学习
1.当row1里边有2个或多个col的时候,如果位置在后边的col的高度大于位置在前边的col,就可能会导致下一个row2在满足col-xs-*在满足和为12的情况下错乱分行.解决办法是强行给row1 ...
- Uva 11059 Maximum Product
注意long long long long longlong !!!!!! 还有 printf的时候 明明longlong型的答案 用了%d WA了也看不出,这个细节要注意!!! #incl ...
- loopback 01
关于loopback的相关blog 安装: 官网 $ mkdir office-supplies $ cd office-supplies $ slc loopback $ slc loopback: ...