实现了一个富文本视图控件。主要针对表情图片,文本字符,URL,等这种类型的文本进行显示。

源码地址 https://github.com/TinyQ/TQRichTextView 实现的效果如下图。

    

控件展示完毕   

---------------------------------------------------------------------------------------------------

这里先介绍下我写这个控件的项目目录结构和功能。从下面这个目录结构截图说起。

 

1.EmojiLmage       文件夹存放的是表情图片资源。

2.TQRichTextBaseRun   这个是特殊文本元素的抽象对象。这里定义了需要子类实现方法和属性。URLRun,ImageRun 等都是从这个继承。

3.TQRichTextURLRun    这个是用来支持URL文本类型的文本元素对象。

4.TQRichTextImageRun  这个是图片类型的文本元素对象。比如表情文本其实是要绘制图片到文本中间。后面的EmojiRun就是派生自这个对象。

5.TQRichTextEmojiRun     这个是表情文本元素对象,用来识别表情字符串替换成表情图片工作。

6.TQRichTextView     文本显示所用到的视图。

这里先简要说一下这个控件的工作流程。

1.首先。肯定是我们会获得一个要现实的文本字符串。 比如是下面这样的。(举例)

“这里是面向程序员的知识分享与学习社区[呵呵][愤怒]不允许发布任何推广、广告、政治方面的https://github.com/TinyQ/TQRichTextView内容”

2.我们需要对这个字符串进行解析。以便剥离出哪些是文本,表情。url。然后文本的话就是普通显示,表情就替换成对应的图片。URL就蓝色高亮显示。

我们解析出来的就是这样的。按照下面的顺序。

  “这里是面向程序员的知识分享与学习社区

  TQRichTextEmojiRun(呵呵)   标记位置是 Rect(18,4)

  TQRichTextEmojiRun(愤怒)   标记位置是 Rect(22,4)

  不允许发布任何推广、广告、政治方面的

  TQRichTextURLRun                 标记位置是 Rect(xx,xx) 我就不数数查了。囧

  内容”

3.绘制。其实CoreText的绘制方式是这样的。它可以将文本全部给CoreText,然后它会给你绘制好。包括换行等。你只需要在表情的地方流出空白,然后在绘制上图片

就可以了,(但其实这个控件里面换行也是自己计算的。因为发现会有行间距不一致的bug,表情在行为换行不对的bug等。用coretext自动绘制的话)。

在这个项目里。简单根据代码说下具体实现

//-- 解析文本内容
- (NSString *)analyzeText:(NSString *)string
{
[self.richTextRunsArray removeAllObjects];
[self.richTextRunRectDic removeAllObjects];
NSString *result = @"";
NSMutableArray *array = self.richTextRunsArray;
result = [TQRichTextEmojiRun analyzeText:string runsArray:&array];
result = [TQRichTextURLRun analyzeText:result runsArray:&array];
[self.richTextRunsArray makeObjectsPerformSelector:@selector(setOriginalFont:) withObject:self.font];
return result;
}

得到文本后,我们对文本进行解析。具体解析算法呢,都是写在对应的RichTextxxxRun中的。

比如表情解析就是在TQRichTextEmojiRun 中。url同理。在解析的过程中,比如解析表情。

匹配到了表情,就生成一个TQRichTextEmojiRun 对象,这个对象记录了这个表情文本的位置。

原始字符等信息。把根据生成的对象放入richTextRunsArray这么一个数组中。用于文字渲染完后根据

这个对象渲染表情图片。因为都是继承baseRun来的。所以,解析出来的不管是表情,还是url什么,都会

统一执行渲染方法。

当我们解析完,得到了特殊文本的run数组对象。我们就绘制文本。然后填补表情等。这些就是在 drawRect

这个方法里面执行的了。我就不贴了。比较长。也比较多。

这里在说明下BaseRun 里面抽象的2个方法

//-- 替换基础文本
- (void)replaceTextWithAttributedString:(NSMutableAttributedString*) attributedString
{
[attributedString addAttribute:@"TQRichTextAttribute" value:self range:self.range];
} //-- 绘制内容
- (BOOL)drawRunWithRect:(CGRect)rect
{
return NO;
}

1.replaceTextWithAttributedString 这个方法,是用来替换文本的。说是替换,其实有2中情况。

如果文本单元是一个表情的话。我需要将原先的字符串用一个空格代替 ,然后预留出画表情的位置。绘制表情图片在图层

在比如文本单元是一个URL的话。其实这里没有替换以前的URL,只是设置了属性字符串。在URL这一段,让他蓝色显示。

2.drawRunWithRect

这个方法是绘制文本单元。和上面类似。如果表情文本单元,这个就要负责回事图片到图层。如果是URL,这个方法直接返回

NO 就好了。告诉绘制的时候。这个方法什么都没有做。(这跟后面做触摸响应时间时候。获得正确的点击区域判断有关系。)

这里我举个例子。比如你用这个控件。你说你不仅仅要实现URL,表情,你要加一个@XXX 要可以点击。也要绿色显示。

那你就可以继承TQRichTextBaseRun 实现一个TQRichTextAtRun。实现这2个方法。可以参照URLRun。然后在加入解析@xxx

这种类型字符串的方法。那么@就得到了支持。具体细节。看源码吧。

IOS 使用CoreText实现表情文本URL等混合显示控件的更多相关文章

  1. iOS系列 基础篇 09 开关、滑块和分段控件

    iOS系列 基础篇 09 开关.滑块和分段控件 目录: 案例说明 开关控件Switch 滑块控件Slider 分段控件Segmented Control 1. 案例说明 开关控件(Switch).滑块 ...

  2. MFC控件编程之 按钮编辑框.静态文本的使用,以及访问控件的七种方法.

    MFC控件编程之 按钮编辑框.静态文本的使用以及访问控件的七种方法. 一丶按钮.静态文本的通用属性. 他们都有一个属性.就是可以输入标题内容.以及可以自定义控件ID. 创建一个MFC Dlg对话框. ...

  3. iOS开发笔记-根据frame大小动态调整fontSize的自适应文本及圆形进度条控件的实现

    最近同样是新App,设计稿里出现一种圆形进度条的设计,如下: 想了想,圆形进度条实现起来不难,但是其中显示百分比的文本确需要自适应,虽然可以使用时自己设定文本字体的大小,但是这样显得很麻烦,也很low ...

  4. iOS开发——UI进阶篇(十九)UISearchBar控件简介

    最近用到搜索功能.总结一下 搜索,无疑可以使用UISearchBar控件! 那就先了解一下UISearchBar控件吧! UISearchBar控件就是要为你完成搜索功能的一个专用控件.它集成了很多你 ...

  5. [iOS微博项目 - 1.8] - 各种尺寸图片加载 & 控件不显示研究

    A. 图片的加载:  [UIImage imageNamed:@"home"];  加载png图片    一.非retina屏幕  1.3.5 inch(320 x 480)  * ...

  6. iOS之分别使用代码和storyboard、xib为控件设置圆角(以按钮为例)

    首先我们看一下代码是如何给按钮设置圆角的: 我们再来看看如何在storyboard或xib中给按钮设置圆角: 1.在storyboard或xib中添加按钮后,设置标题和背景色,做好约束: 2.点击 S ...

  7. IOS的一个带动画的多项选择的控件(一)

    先上效果图: 这个程序分2个层次,一个是顶部的带UITextField的bar,一个是下拉选择的view,下拉选择的view带有4个自己定义的UIView 我们先定义一个UIViewControlle ...

  8. IOS 在一个透明视图上添加不透明的子控件

    环境: 在一个透明的view中添加一个tableview,tableview也变透明了. 解决: 不要这样设置view的透明度 view.backgroundColor = [UIColor clea ...

  9. TYAttributedLabel——简单,强大的iOS属性文本控件

    本文转载至 http://www.mobile-open.com/2015/86578.html TYAttributedLabel 简单,强大的属性文本的控件(无需了解CoreText),支持图文混 ...

随机推荐

  1. 仪表盘 hostmap 新玩法让运维工作越玩越 high

    Cloud Insight 第13次新品发布会现在开始,首先非常感谢大家前来看我们的新功能发布会,下面我先给大家介绍一下新功能,之后有什么问题大家尽管问

  2. 国内最大的 Node.js 社区将 New Relic 的监控产品换成了 OneAPM

    国内最知名的 CNode 社区把 New Relic 的监控产品换成了 OneAPM .难道 APM 的老大 New Relic 已经被 OneAPM 超越? 毋庸置疑,在全球应用性能管理 SaaS ...

  3. POJ 2246 Matrix Chain Multiplication(结构体+栈+模拟+矩阵相乘)

    题意:给出矩阵相乘的表达式,让你计算需要的相乘次数,如果不能相乘,则输出error. 思路: 参考的网站连接:http://blog.csdn.net/wangjian8006/article/det ...

  4. C# Log4Net配置

    Log4Net是用来记录日志的,可以将程序运行过程中的信息输出到一些地方(文件.数据库.EventLog等),日志就是程序的黑匣子,可以通过日志查看系统的运行过程,从而发现系统的问题.日志的作用:将运 ...

  5. hdu 3923 Invoker

    完全是套用polya模版…… ;}

  6. (step4.3.4)hdu 1258(Sum It Up——DFS)

    题目大意:输入t,n,接下来有n个数组成的一个序列.输出总和为t的子序列 解题思路:DFS 代码如下(有详细的注释): #include <iostream> #include <a ...

  7. 简单的XPath入门

    XPath即为XML路径语言,它是一种用来确定XML(标准通用标记语言的子集)文档中某部分位置的语言.XPath基于XML的树状结构,提供在数据结构树中找寻节点的能力.XPath 是 XML 的查询语 ...

  8. oracle SQL Develop导出数据库中的表格数据到excel

    首先打开oracle数据库 1.查询数据库, SELECT * FROM pub_attribute WHERE ELEMENT_CODE='bb382e10d7ce437b8a8c980ba20ac ...

  9. 演练:Office 编程(C# 和 Visual Basic)

    https://msdn.microsoft.com/zh-cn/library/ee342218(v=vs.110).aspx PIA的全称是 primary interop assembly  主 ...

  10. Android仿iPhone晃动撤销输入功能(微信摇一摇功能)

    重力传感器微信摇一摇SensorMannager自定义alertdialogSensorEventListener 很多程序中我们可能会输入长文本内容,比如短信,写便笺等,如果想一次性撤销所有的键入内 ...