在上一篇博客中山寨了一下新浪微博,在之后的博客中会对上一篇代码进行优化和重用,上一篇的微博请求的文字中有一些表情没做处理,比如带有表情的文字是这样的“我要[大笑],[得意]”。显示的就是请求的字符串,那么我们如何把文字在本地转换成表情呢?下面将要说一下显示表情的解决方案。

  要用到的知识:IOS开发中的资源文件.plist, 可变的属性字符串,TextView和正则表达式的使用。

  解决的整体思路:把源字符串同过正则匹配获取到每个表情的range, 再通过range获取元字符串中的表情字符串,如[哈哈], 在把[哈哈] 和我们.plist中item下的chs字段匹配,然后获取对应的图片名,获取图片后把图片转换成可变字符串的附件,然后做一个替换即可。先这么大致一说,下面会详细的讲解一下。

  1.要想在我们手机上显示网络请求的表情,首先我们本地得有相应的资源文件,在.plist文件中又我们想要的东西,其中存储的东西如下所示,整个root是一个数组,数组中的item是一个字典,字典中存放的时文字到图片名的一个映射,当然啦,图片名和我们本地资源的图片名相同。截图如下

  2.如何从.plist文件中获取数据呢?先通过bundle获取资源文件的路径,在通过文件路径创建数组,数组中存储的数据就是文件中的内容代码如下:

//加载plist文件中的数据NSBundle *bundle = [NSBundle mainBundle];//寻找资源的路径NSString *path = [bundle pathForResource:@"emoticons" ofType:@"plist"];//获取plist中的数据NSArray *face = [[NSArray alloc] initWithContentsOfFile:path];

  3.生成我们的测试字符串,最后一个不是任何表情,不做替换。

    //我们要显示的字符串(模拟网路请求的字符串格式)NSString *str = @"我[围观]你[威武]你[嘻嘻]我[爱你]你[兔子]我[酷]你[帅]我[思考]你[钱][123456]";

  4.把上面的str转换为可变的属性字符串,因为我们要用可变的属性字符串在TextView上显示我们的表情图片,转换代码如下:

   //创建一个可变的属性字符串NSMutableAttributedString *attributeString = [[NSMutableAttributedString alloc] initWithString:str];

  5.进行正则匹配,获取每个表情在字符串中的范围,下面的正则表达式会匹配[/*],所以[123567]也会被匹配上,下面我们会做相应的处理

//正则匹配要替换的文字的范围//正则表达式NSString * pattern = @"\\[[a-zA-Z0-9\\u4e00-\\u9fa5]+\\]";NSError *error = nil;NSRegularExpression * re = [NSRegularExpression regularExpressionWithPattern:pattern options:NSRegularExpressionCaseInsensitive error:&error];if (!re) {NSLog(@"%@", [error localizedDescription]);}//通过正则表达式来匹配字符串NSArray *resultArray = [re matchesInString:str options:0 range:NSMakeRange(0, str.length)];

  6.数据准备工作完成,下面开始遍历资源文件找到文字对应的图片,找到后把图片名存入字典中,图片在源字符串中的位置也要存入到字典中,最后把字典存入可变数组中。代码如下:

//用来存放字典,字典中存储的是图片和图片对应的位置NSMutableArray *imageArray = [NSMutableArray arrayWithCapacity:resultArray.count];//根据匹配范围来用图片进行相应的替换for(NSTextCheckingResult *match in resultArray) {//获取数组元素中得到rangeNSRange range = [match range];//获取原字符串中对应的值NSString *subStr = [str substringWithRange:range];for (int i = 0; i < face.count; i ++){if ([face[i][@"chs"] isEqualToString:subStr]){//face[i][@"gif"]就是我们要加载的图片//新建文字附件来存放我们的图片NSTextAttachment *textAttachment = [[NSTextAttachment alloc] init];//给附件添加图片textAttachment.image = [UIImage imageNamed:face[i][@"png"]];//把附件转换成可变字符串,用于替换掉源字符串中的表情文字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];}}}

  7.转换完成,我们需要对attributeString进行替换,替换的时候要从后往前替换,弱从前往后替换,会造成range和图片要放的位置不匹配的问题。替换代码如下:

//从后往前替换for (int i = imageArray.count -1; i >= 0; i--){NSRange range;[imageArray[i][@"range"] getValue:&range];//进行替换[attributeString replaceCharactersInRange:range withAttributedString:imageArray[i][@"image"]];}

  8.把替换好的可变属性字符串赋给TextView

1     //把替换后的值赋给我们的TextView
2     self.myTextView.attributedText = attributeString;

 9.替换前后效果如下:

IOS开发之显示微博表情相关推荐

  1. IOS开发基础之微博项目

    IOS开发基础之微博项目 关键性代码 // // NJViewController.m // 06-预习-微博(通过代码自定义cell)// #import "NJViewControlle ...

  2. IOS开发基础之微博项目第1天-OC版

    IOS开发基础之微博项目第1天-OC版 纯代码创建的项目,具有参考价值 该资料来自2014年7月3号,虽然时间过去较长,但是oc和swift不同,oc语法迭代更新慢 具有一定的参考意义 涉及xib加载 ...

  3. iOS开发之仿微博视频边下边播之自定义AVPlayer播放器, 边下边播解剖。视频处理流程,建立连接-请求数据-统筹数据-解码数据-视频呈现

    Tips:这次的内容分为两篇文章讲述 01.[iOS]仿微博视频边下边播之封装播放器 讲述如何封装一个实现了边下边播并且缓存的视频播放器. 02.[iOS]仿微博视频边下边播之滑动TableView自 ...

  4. iOS开发-------自定义简单的表情键盘(UICollectionView 集合视图)

    最近制作自制表情键盘的时候,突然了解到还有一个叫做UICollectionView (集合视图)的类,就研究了一下,确实在做表情键盘上要比用 UIScrollView(滚动视图) 要简单的多,用法与 ...

  5. iOS开发中显示实时的FPS值

    OttoFPSButton 前言 在项目开发中,有的时候需要查看实时的FPS值,以此作为性能的参考. 优势 实时显示FPS值. 可以拖到任意位置贴边,不影响调试. 效果图 使用 将OttoFPSBut ...

  6. iOS开发之接入微博三方登录时遇到的问题

    1.你所访问的站点在微博认证四百,错误号:21322 重定向地址不匹配 原因:微博开放平台中的授权回调页地址与工程中不一致,需要改为一致的. WBAuthorizeRequest *request = ...

  7. ios emjoi java_前端App开发,实际工作中三端(android,ios,前端H5)emoji表情显示解决方案...

    想起最近开发APP的时候,产品提的一个需求,用户的帖子正文还有评论内容里,要能够显示emoji表情,因为我们这款app是混合开发的,APP里的发贴,发评论是原生做的(android和ios),但帖子详 ...

  8. 微博的文本编辑和显示(emoji表情,@某人、链接高亮点击)

    日常开发的过程中我们经常会需要实现类似微博的文本输入框,可以自定义的emoji.@某人高亮显示.快捷删除.文本显示表情.@人和链接点解等效果.本人躺尸过各种坑后来一波,废话不说,先看效果: Demo ...

  9. 【ios开发/Xcode】使用UITableView完成学生信息及成绩的显示

    [ios开发/Xcode]使用UITableView完成学生信息及成绩的显示 设计思想 实现效果 源代码 设计思想 首先创建所有页面的故事版,包括,登录.注册与成绩页面 接着设置故事版的关联代码,如下 ...

  10. html居右显示语言设置,iOS开发:纯代码设置UIButton文字居左或者居右显示

    UIButton这个控件使用,作为资深的iOS开发人员来说是小儿科,但是有些时候还是需要记录一下UIButton的一些其他用法,这样方便快速解决实际问题.比如UIButton的纯代码编程的时候,设置文 ...

最新文章

  1. 在mysql查询库和表_查询mysql 库和表占的大小
  2. 利用T-SQL语句快速清理ZBLOG程序的SQL SERVER2012数据库内容
  3. 童年记忆-莴苣姑娘的故事
  4. 如何用纯 CSS 创作一个荧光脉冲 loader 特效
  5. [省级大创项目]教育类APP的探索和实践——大学物理实验助手APP开发
  6. linux c之在终端如何依赖.o文件(静态链接库)运行C文件的命令
  7. P4292-[WC2010]重建计划【长链剖分,线段树,0/1分数规划】
  8. SIP 中的Dialog,call,session 和 transaction .
  9. 从今天开始学习iOS开发(iOS 7版)-- 概论 (一)
  10. 吴恩达机器学习作业Python实现(五):偏差和方差
  11. mysql添加列默认null_MySQL-无法在列中插入NULL值,但是我指定了默认值吗?
  12. 经典日内策略分析(收藏版)Dual Thrust、ATR、R-Breaker、菲阿里四价
  13. Google Earth影像数据破解之旅
  14. 在250美元5天城市
  15. Web IDE优势在哪?详解Web版数据库管理工具SQL Studio
  16. spring boot日志配置文件(彩色日志)logback-spring.xml
  17. 清华大学五道口金融学院2023年博士生招生简章(普博+直博)
  18. 月份30或31c语言编程,C语言程序设计上机编程方法.PPT
  19. 模糊数学导论——模糊聚类分析
  20. C++_32位和64程序

热门文章

  1. python作用域总结_关于Python作用域自学总结
  2. 转移服务器显示乱码,两台服务器之间数据传输乱码问题
  3. python画立体心形折纸图解_立体的心形盒子的折纸图解过程
  4. java 栈泛型_使用泛型实现栈结构
  5. java se ee me 区别_JDK与Java SE/EE/ME的区别
  6. layui分页完整实例php,使用 layui 后端分页的实例
  7. 网络克隆自动修改计算机名ip,GHOST网克专用IP及计算机名自动修改器
  8. ie手机浏览器_最终还是说再见!微软宣布重要消息,IE浏览器被放弃
  9. 转:jdk动态代理实现
  10. VC2013配置OpenCV开发环境