IOS 使用CoreText实现表情文本URL等混合显示控件
实现了一个富文本视图控件。主要针对表情图片,文本字符,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等混合显示控件的更多相关文章
- iOS系列 基础篇 09 开关、滑块和分段控件
iOS系列 基础篇 09 开关.滑块和分段控件 目录: 案例说明 开关控件Switch 滑块控件Slider 分段控件Segmented Control 1. 案例说明 开关控件(Switch).滑块 ...
- MFC控件编程之 按钮编辑框.静态文本的使用,以及访问控件的七种方法.
MFC控件编程之 按钮编辑框.静态文本的使用以及访问控件的七种方法. 一丶按钮.静态文本的通用属性. 他们都有一个属性.就是可以输入标题内容.以及可以自定义控件ID. 创建一个MFC Dlg对话框. ...
- iOS开发笔记-根据frame大小动态调整fontSize的自适应文本及圆形进度条控件的实现
最近同样是新App,设计稿里出现一种圆形进度条的设计,如下: 想了想,圆形进度条实现起来不难,但是其中显示百分比的文本确需要自适应,虽然可以使用时自己设定文本字体的大小,但是这样显得很麻烦,也很low ...
- iOS开发——UI进阶篇(十九)UISearchBar控件简介
最近用到搜索功能.总结一下 搜索,无疑可以使用UISearchBar控件! 那就先了解一下UISearchBar控件吧! UISearchBar控件就是要为你完成搜索功能的一个专用控件.它集成了很多你 ...
- [iOS微博项目 - 1.8] - 各种尺寸图片加载 & 控件不显示研究
A. 图片的加载: [UIImage imageNamed:@"home"]; 加载png图片 一.非retina屏幕 1.3.5 inch(320 x 480) * ...
- iOS之分别使用代码和storyboard、xib为控件设置圆角(以按钮为例)
首先我们看一下代码是如何给按钮设置圆角的: 我们再来看看如何在storyboard或xib中给按钮设置圆角: 1.在storyboard或xib中添加按钮后,设置标题和背景色,做好约束: 2.点击 S ...
- IOS的一个带动画的多项选择的控件(一)
先上效果图: 这个程序分2个层次,一个是顶部的带UITextField的bar,一个是下拉选择的view,下拉选择的view带有4个自己定义的UIView 我们先定义一个UIViewControlle ...
- IOS 在一个透明视图上添加不透明的子控件
环境: 在一个透明的view中添加一个tableview,tableview也变透明了. 解决: 不要这样设置view的透明度 view.backgroundColor = [UIColor clea ...
- TYAttributedLabel——简单,强大的iOS属性文本控件
本文转载至 http://www.mobile-open.com/2015/86578.html TYAttributedLabel 简单,强大的属性文本的控件(无需了解CoreText),支持图文混 ...
随机推荐
- 谁会是 Zabbix 和 Nagios 的继任者?
[编者按]本文根据 Dataloop.IO 的创始人兼 CEO David Gildeh 对监控工具市场的现状分析以及对未来发展趋势的展望,展开拓展讨论. 为什么监控还是一塌糊涂? 为了调研市场,从而 ...
- ASP .NET 如何在 SQL 查询层面实现分页
[编者按]本文作者为来自巴基斯坦的软件开发工程师 Aqeeel,主要介绍了在 SQL 查询层面实现 ASP.NET 应用的分页方法. 本文系 OneAPM 工程师编译呈现,以下为正文. GridVie ...
- Lua print on the same line
In Pascal, I have write and writeln. Apparently Lua's print is similar to writeln of Pascal. Do we h ...
- ****Git 常用命令和使用思维导图
Git 是一个很强大的分布式版本控制系统.它不但适用于管理大型开源软件的源代码,管理私人的文档和源代码也有很多优势. 本来想着只把最有用.最常用的 Git 命令记下来,但是总觉得这个也挺有用.那个也用 ...
- SDUT2482二叉排序树
http://acm.sdut.edu.cn/sdutoj/showproblem.php?pid=2482&cid=1184 题目描述 二叉排序树的定义是:或者是一棵空树,或者是具有下列性质 ...
- Git stash方法(转)
命令:git stash1.使用git stash保存当前的工作现场,那么就可以切换到其他分支进行工作,或者在当前分支上完成其他紧急的工作,比如修订一个bug测试提交. 2.如果一个使用了一个git ...
- lintcode 中等题:partition array 数组划分
题目 数组划分 给出一个整数数组nums和一个整数k.划分数组(即移动数组nums中的元素),使得: 所有小于k的元素移到左边 所有大于等于k的元素移到右边 返回数组划分的位置,即数组中第一个位置i, ...
- 数据类型演示DataTypeDemo
/***数据类型演示*/public class DataTypeDemo{ public static void main(String[] args){ //直接赋予的值,称为字面量 //by ...
- WP之Sql Server CE数据库
如何在WP8中进行数据存储,你首先想到应该是独立存储,但是独立存储似乎存储文件更方便,如果我们希望像处理对象的形式,该怎么办呢,答案就是Sql Server CE. Sql Server CE并不是新 ...
- Android 清除canvas 笔迹代码
canvas.drawColor(Color.TRANSPARENT, PorterDuff.Mode.CLEAR); canvas.drawLine(pointX, , event.getX(), ...