当前位置: 首页 > news >正文

[代码] 类似 YYText 将表情文本转换成表情字符

一,经历

1> 由于工作需要,得把 UITextView 中的属性文本转换成普通文字,并将处理后的普通文字转换成属性文本.

2> 将属性文本转换成普通文字简单,可以调用属性文本的enumerateAttribute:inRange:options:usingBlock:方法.

3> 如何将普通文字中的表情符号[:xx]转换成显示的表情呢?这是一个很麻烦的过程,先贴上我研究了三四个小时的代码.

 1 -(NSMutableAttributedString *)EmojiTextInTextView:(NSString*)text
 2 {
 3     NSMutableAttributedString *emojiText = [[NSMutableAttributedString alloc]initWithString:text];
 4         NSArray *keys = [self.emojiManager.dictAllEmoji allKeys];
 5     
 6         // 若存在[:就遍历所有的表情
 7         do {
 8             BOOL bFindEmoji = NO;
 9             for (id key in keys) {
10                 // 有表情
11                 if ([text rangeOfString:key].location != NSNotFound) {
12                     bFindEmoji = YES;
13                     // 模拟属性字符串,使用普通文本占领表情位置,方便确定表情位置
14                     NSRange range = [text rangeOfString:key];
15                     text = [text stringByReplacingCharactersInRange:range withString:@"1"];
16                     
17                     // 转换成表情图片
18                     UIImage *img = self.emojiManager.dictAllEmoji[key];
19                     EmojiTextAttachment *attach = [[EmojiTextAttachment alloc]initWithData:nil ofType:nil];
20                     if(img) attach.image = img;
21                     attach.emojiTag = key;
22                     NSAttributedString *replaceAttri = [NSAttributedString attributedStringWithAttachment:attach];
23                     [emojiText replaceCharactersInRange:range withAttributedString:replaceAttri];
24                     if ([text rangeOfString:@"[:"].location == NSNotFound){
25                         break;
26                     }
27                 }
28             }
29             // 若没有查找到一个表情,就退出
30             if (bFindEmoji == NO) {
31                 break;
32             } else {
33                 bFindEmoji = NO;
34             }
35         }while ([text rangeOfString:@"[:"].location != NSNotFound);
36     return emojiText;
37 }

 

4> 一开始没想到用双层循环,但是单层循环只会遍历一次表情字符串,如果文本中有多个表情字符串,就会漏掉,因此必须使用双层循环,外层用找到[:作为循环终止条件,内层用没有[:作为跳出跳出条件.

5> 后来漏掉了包含[:但是不是表情字符串的情况,因此我就需要加一个 bool 变量,当遍历一次所有表情字符串,没有找到就让该变量置为 NO, 然后跳出第二层循环,排除有[:但是没有表情包的情况.

转载于:https://www.cnblogs.com/lz465350/p/5311777.html

相关文章:

  • [na]wireshark抓包排错-tcp.flags.reset
  • 【字符编码】彻底理解字符编码
  • app调用支付宝支付 笔记
  • OC和Swift混编技巧
  • js和android原生代码交互
  • 学习进度汇总
  • TableView不显示没内容的Cell怎么办?
  • 浅析Java中的访问权限控制
  • 优步每周结算时间:每周二下午4点!
  • 获取java类和方法名
  • ISBN
  • 解决john不能开多个进程的问题
  • StringBuilder与StringBuffer
  • 欧拉赞词
  • 或许是 Nginx 上配置 HTTP2 最实在的教程了
  • 【css3】浏览器内核及其兼容性
  • 【Leetcode】104. 二叉树的最大深度
  • 2017年终总结、随想
  • Android路由框架AnnoRouter:使用Java接口来定义路由跳转
  • Android系统模拟器绘制实现概述
  • DataBase in Android
  • ES6之路之模块详解
  • JavaScript 奇技淫巧
  • JS专题之继承
  • Linux快速配置 VIM 实现语法高亮 补全 缩进等功能
  • Spark RDD学习: aggregate函数
  • SpringBoot几种定时任务的实现方式
  • Vue2.0 实现互斥
  • vue-router的history模式发布配置
  • win10下安装mysql5.7
  • WinRAR存在严重的安全漏洞影响5亿用户
  • 给初学者:JavaScript 中数组操作注意点
  • 开年巨制!千人千面回放技术让你“看到”Flutter用户侧问题
  • 看图轻松理解数据结构与算法系列(基于数组的栈)
  • 聊聊spring cloud的LoadBalancerAutoConfiguration
  • 每天10道Java面试题,跟我走,offer有!
  • 如何在GitHub上创建个人博客
  • 小程序测试方案初探
  • 源码之下无秘密 ── 做最好的 Netty 源码分析教程
  • 远离DoS攻击 Windows Server 2016发布DNS政策
  • 如何通过报表单元格右键控制报表跳转到不同链接地址 ...
  • ​Linux Ubuntu环境下使用docker构建spark运行环境(超级详细)
  • (04)odoo视图操作
  • (07)Hive——窗口函数详解
  • (4)logging(日志模块)
  • (java版)排序算法----【冒泡,选择,插入,希尔,快速排序,归并排序,基数排序】超详细~~
  • (JS基础)String 类型
  • (Matlab)基于蝙蝠算法实现电力系统经济调度
  • (Redis使用系列) Springboot 使用Redis+Session实现Session共享 ,简单的单点登录 五
  • (Redis使用系列) Springboot 使用redis实现接口Api限流 十
  • (附源码)ssm教师工作量核算统计系统 毕业设计 162307
  • (简单) HDU 2612 Find a way,BFS。
  • (南京观海微电子)——I3C协议介绍
  • (亲测成功)在centos7.5上安装kvm,通过VNC远程连接并创建多台ubuntu虚拟机(ubuntu server版本)...
  • (转载)虚函数剖析