背景:前些天突然想做一个笔记本功能,一开始,觉得挺简单的呀,一个UITextView,网络缓存也不干了,直接本地NSUserDefault存储,然后完事了,美工,弄几张好看的图片,加几个动画,也就这样了。接着,按照惯例,查看已有的备忘录软件,其app store知名的软件:Weiconote等。
才发现没那么简单。这里先不考虑图文混排的问题,首先面对的就是:键盘隐藏之后,文字的位置移动问题啦。细心的体验后发现:系统的备忘录,已经一些做得好的软件,都会进行一些处理,例如:
1.当我编辑的时候,光标应该是一直不被键盘高度隐藏的才对。
2.我在文字中间进行编辑的话,编辑完成隐藏键盘,UITextView的文字位置这个时候应该是我刚才编辑的部分。
于是开始写:
1. 查看了暴露出来的API,属性,不被键盘高度遮住,frame,contentInset,textContainerInset,都可以做到。
根据键盘的本身的 notification ,或者UITextView delegate ,能轻易做到。
部分代码:
 
2.解决方法比较麻烦,查看了所有的api,就只有父类的这个api有用的:
- (void)scrollRectToVisible:(CGRect)rect animated:(bool)animate;
接下来的问题来了,根据光标当前的位置高度,手动计算属性,然后,获取要移动的位置,进行跳转。因为默认的情况是:只要键盘隐藏了,会自动跳到UITextView的最前面的。至于获取光标位置,以及计算移动的位置的问题,可以很快查到资料的。
这里的这位哥,也遇到同样的问题,解决方式也是一样的。 http://petersteinberger.com/blog/2014/fixing-uitextview-on-ios-7/ 里边也已经有了github源码分享。(不做重复的事情)
事实上,问题2最好的解决方式是:自己根据TextKit封装一个UITextView...
 
上面的背景就是这样了,解决了问题后,发现,为什么不顺便把图文混排的问题也一次性解决了。一直以来,富文本编辑都是没有深入的,之前也是直接用的开源代码,或者UIWebView,总是心里不踏实,卡顿的情况偶尔发生,非常不开心。于是,接下来,才是今天主要想分享的东西了:富文本问题。
 
关键词:coretext textkit
第三方库分析:DTCoretext M80AttributedLabel FastText EGOText
 
官网参考资料:
 
TextKit能让我们自己手动管理字体的颜色,样式(Text Layout),触摸事件,排版,图文的混排规则。
Textkit是基于CoreText的,与WebKit是两个不同的分支。我主要查看的也是TextKit,用coreText太麻烦了。而它们之间的关系逻辑如下图所示:
具体到显示上,渲染的流程是先从存储的NSTextStorage中获取text以及它的attributes,再经过NSLayoutManager布局显示容器包括形状,大小等,再经过NSTextContainer布局呈具体的显示,最后展示在UI上。渲染和实现的流程:
 
这里注意描述:By using multiple text containers, each with an associated text view, more complex layout arrangements are possible. 
 
到了这里,基本心理有个谱了。大致清楚这个逻辑了。接下来细分一下:
 
a.这里,先说一下具体到文本的样式,先上一张官方的说明图:
我们可以设置文字的字体各种细节,段落排版,对其方式,缩进规则等。
关于样式:自带有六种,通过UIFont直接设置:
 
b.然后开始写图文混排了
参考代码:
NSMutableAttributedString *string;
通过插入NSTextAttachment设置image对象,其中NSTextAttachment可以继承重写方法实现修改插入内容大小。
这里实际上就是找到一个NSRange位置然后插入图片,常见的插入表情。然后表情转换成字符串输出出来。字符串再转换成图片输出。
我们可以遍历输入的字符串,通过NSTextStorage设置字符串的字体,进行自定义规则处理等,例如,##进行标题大写,高亮等。
通过NSLayoutManager来设置输入文本内容行数,文本段的缩进规则,行间距等。
通过NSTextContainer来设置文字的布局方式,例如图文环绕方式,等。
基本的Text Kit 功能这样子了,基本能满足富文本的所有要求了。自己排版,按照自己项目的业务逻辑做一些事情。
 
最后还是附加开头提到的一些库,阅读好的源码分析比什么都好:
M80AttributedLabel:基本的TextKit封装,代码易懂,例子非常好用简单,试过效果挺好,需要做一些性能优化处理。
DTCoretext: CoreText封装,解析正规的HTML源码,展示出来成富文本,非常强大,如果安卓端和IOS使用同一套接口的时候,就非常好用了。兼容问题。
 
部分参考链接:
⚠:DTCoreText 运行的时候有提示需要先进行:git submodule init  update 
 
 
 

iOS富文本的更多相关文章

  1. iOS富文本组件的实现—DTCoreText源码解析 数据篇

    本文转载 http://blog.cnbang.net/tech/2630/ DTCoreText是个开源的iOS富文本组件,它可以解析HTML与CSS最终用CoreText绘制出来,通常用于在一些需 ...

  2. iOS - 富文本AttributedString

    最近项目中用到了图文混排,所以就研究了一下iOS中的富文本,打算把研究的结果分享一下,也是对自己学习的一个总结. 在iOS中或者Mac OS X中怎样才能将一个字符串绘制到屏幕上呢?         ...

  3. OS开发小记:iOS富文本框架DTCoreText在UITableView上的使用

    要在页面中显示自己的布局,比如文字的字体和颜色.图文并排的样式,我们要用iOS SDK的原生UI在app本地搭建,如果一个页面需要在服务器端获取数据的话,我们也要在本地搭建好固定的布局,解析服务器传回 ...

  4. iOS - 富文本

    iOS--NSAttributedString超全属性详解及应用(富文本.图文混排)   ios项目中经常需要显示一些带有特殊样式的文本,比如说带有下划线.删除线.斜体.空心字体.背景色.阴影以及图文 ...

  5. iOS 富文本类库RTLabel

      本文转载至 http://blog.csdn.net/duxinfeng2010/article/details/9004749  本节关于RTLable基本介绍,原文来自 https://git ...

  6. iOS富文本(一)属性化字符串

    概述 iOS一些复杂的文本布局一般都是由底层的Core Text来实现的,直到iOS7苹果发布了Text Kit框架,Text Kit能够很简单实现一些复杂的文本样式以及布局,而Text Kit富文本 ...

  7. iOS富文本的使用

    NSString *name = nil; if (_payNumber == 1) { name = [NSString stringWithFormat:@"向%@收款",na ...

  8. iOS富文本-NSAttributedString简单封装

    直接调用系统的写起来比较麻烦,封装一下 因为要简单所以就写类方法 WJAttributeStyle 基类 ) {         ; i < styles.count; i ++) {      ...

  9. ios富文本的简单使用 AttributedString

    富文本,顾名思义就是丰富的文本格式,本文demo使用NSMutableAttributedString //获取富文本 NSMutableAttributedString*attributeStrin ...

随机推荐

  1. zip伪加密文件分析(进阶版)

    作者近日偶然获得一misc题,本来以为手到擒来,毕竟这是个大家都讨论烂了的题,详情访问链接http://blog.csdn.net/ETF6996/article/details/51946250.既 ...

  2. python学习之python开发环境搭建

    Python简介 Python是一种面向对象.解释型计算机程序设计语言.Python语法简洁而清晰,具有丰富和强大的类库等等众多的特性,这是来自百度百科的介绍,在百度百科还能看到它的更详细的介绍信息, ...

  3. HTML 表格

    HTML 表格:表格由<table>标签来定义,行数由<tr>标签来定义,单元格由<td>标签来定义:<table border="1"& ...

  4. JVM 参数分配

    http://stackoverflow.com/questions/41216388/java-jvm-parameter-xms-doesnt-take-effect-immediately It ...

  5. Docker 容器部署 Consul 集群

    Docker 容器部署 Consul 集群 一.docker安装与启动1.1安装docker[root@localhost /]# yum -y install docker-io 1.2更改配置文件 ...

  6. 深入浅出SQL Server中的死锁

    简介 死锁的本质是一种僵持状态,是多个主体对于资源的争用而导致的.理解死锁首先需要对死锁所涉及的相关观念有一个理解. 一些基础知识 要理解SQL Server中的死锁,更好的方式是通过类比从更大的面理 ...

  7. 一起买beta版本文档报告汇总

    一起买beta版本文档报告汇总 031402401鲍亮 031402402曹鑫杰 031402403常松 031402412林淋 031402418汪培侨 031402426许秋鑫 一.Beta版本冲 ...

  8. [Linux] - Docker移动数据到其它盘的办法

    由于使用yum安装Docker,默认是数据是存放在系统盘/var/lib目录下,需要把它放到其实盘里头.方法可以这样做: 1.在其它盘中新建一个目录,比如我的:/yunpan/docker mkdir ...

  9. 使用Ajax实现的批量删除操作(C#)

    今天做了一个简单的批量删除操作,虽然简单,但是很多问题出现,终究还是技术不够熟练. 现在在这里跟大家分享一下.仅供学习... 1.在前台获取用户点击的信息id,把这里id封装到一个数组里面:(rows ...

  10. 跨平台开发之阿里Weex框架环境搭建(一)

    转载自:http://www.cnblogs.com/fozero/p/5995122.html 一.介绍 Weex是阿里今年6月份推出的跨平台解决方案,6月底正式开源.官网 https://alib ...