iOS富文本

iOS富文本
背景:前些天突然想做一个笔记本功能,一开始,觉得挺简单的呀,一个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
官网参考资料:
UITextKit: https://developer.apple.com/library/ios/documentation/StringsTextFonts/Conceptual/TextAndWebiPhoneOS/Introduction/Introduction.html
CoreText: https://developer.apple.com/library/ios/documentation/StringsTextFonts/Conceptual/CoreText_Programming/Introduction/Introduction.html#//apple_ref/doc/uid/TP40005533
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直接设置:
UIFontTextStyleHeadline, UIFontTextStyleSubheadline, UIFontTextStyleBody, UIFontTextStyleFootnot, UIFontTextStyleCaption1, UIFontTextStyleCaption2
b.然后开始写图文混排了
参考代码:
NSMutableAttributedString *string;
通过插入NSTextAttachment设置image对象,其中NSTextAttachment可以继承重写方法实现修改插入内容大小。
这里实际上就是找到一个NSRange位置然后插入图片,常见的插入表情。然后表情转换成字符串输出出来。字符串再转换成图片输出。
我们可以遍历输入的字符串,通过NSTextStorage设置字符串的字体,进行自定义规则处理等,例如,##进行标题大写,高亮等。
通过NSLayoutManager来设置输入文本内容行数,文本段的缩进规则,行间距等。
通过NSTextContainer来设置文字的布局方式,例如图文环绕方式,等。
基本的Text Kit 功能这样子了,基本能满足富文本的所有要求了。自己排版,按照自己项目的业务逻辑做一些事情。
最后还是附加开头提到的一些库,阅读好的源码分析比什么都好:
M80AttributedLabel:基本的TextKit封装,代码易懂,例子非常好用简单,试过效果挺好,需要做一些性能优化处理。
DTCoretext: CoreText封装,解析正规的HTML源码,展示出来成富文本,非常强大,如果安卓端和IOS使用同一套接口的时候,就非常好用了。兼容问题。
部分参考链接:
http://esoftmobile.com/2013/10/17/text-kit%E8%BF%9B%E9%98%B6/#more
https://github.com/xiangwangfeng/M80AttributedLabel
https://github.com/Cocoanetics/DTCoreText
⚠:DTCoreText 运行的时候有提示需要先进行:git submodule init  update 
posted on 2015-04-16 11:35 yanshanLove 阅读(...) 评论(...) 编辑 收藏

转载于:https://www.cnblogs.com/Lxiaolong/p/4431589.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/257417.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

SQL编程题-----1

首先,题目给出这个数据库表格 要求写出SQL语句使之变成如下表格 解决方法: SELECT t1.Rq,t1.胜,t2.负 FROM //t1和t2是自己命的新表格的名字 (SELECT Rq,COUNT(*) AS 胜 //As 胜意思是输出结果时列名为”胜“FROM testtableWHERE Sh…

六角填数---第五届蓝桥杯

/** 如图【1.png】所看到的六角形中,填入1~12的数字。使得每条直线上的数字之和都同样。图中,已经替你填好了3个数字,请你计算星号位置所代表的数字是多少?请通过浏览器提交答案。不要填写多余的内容。*/ public class 六角填数 {…

linux命令编写,编写简单的linux命令

8种机械键盘轴体对比本人程序员,要买一个写代码的键盘,请问红轴和茶轴怎么选?又到了周四分享环节,鉴于最近在看linux编程实践,所以就的讲一下如何编写一个简单的who命令。PPTManual PageManual Page 也就是大家常用的m…

linux不登录用户就关机,Linux无法被远程登录;用户的关机, 重启,注销,新增用户,删除用户...

不能使用xshell连接到我的Linux服务器通过再windows的cmd中ping了我的Linux地址,发现网络不通。查看百度发现是因为网络没有选桥接模式,然后选完桥接模式告诉我:然后发现没有虚拟网卡,原因是之前装过vm没有卸载干净,使…

程序员的国庆节如何安排,你想好了吗?

2019独角兽企业重金招聘Python工程师标准>>> 就要国庆放假了,国庆节是旅游的黄金期,同时也是我们买买买的幸福期,作为一名技术开发,除了要安排假期旅游行程外也不要忘记提升自己,准备好学习计划&#xff0c…

微服务实战(一):微服务架构的优势与不足

本文讲的是微服务实战(一):微服务架构的优势与不足,【编者的话】本文来自Nginx官方博客,是微服务系列文章的第一篇,主要探讨了传统的单体式应用的不足,以及微服务架构的优势与挑战。正如作者所说…

linux创建zip+函数,linux+shell基础知识

目录:1.路径:2.进程:3.清屏和退出当前命令操作:4.ls 参数:5.创建目录\文件\复制文件:6.查看文件内容:7.linux通配符:8.grep:9.终止命令:10.搜索文件:11.查看网…

关于浮动float属性和position:absolute属性的区别

最近返回头看了很多书籍,一直在纠结float属性和absolute绝对定位的区别和使用的情况,给大家分享一下自己的心得和体会吧。 1,float属性 float属性意义是让元素拜托独占一行的霸道总裁,成为一个普普通通的人。比如下面这个例子 如图…

Climbing Stairs

You are climbing a stair case. It takes n steps to reach to the top. Each time you can either climb 1 or 2 steps. In how many distinct ways can you climb to the top? 分析:考虑走第n步时的情况,可以从第n-1个台阶走一步,也可以从…

高级组合技打造“完美” 捆绑后门

0x00 简介 之前写过一篇关于客户端钓鱼的文章:《使用powershell Client进行有效钓鱼》中,在使用各个Client进行测试的过程中,个人发现CHM文件是最好用的一个,但是其缺点就是会弹黑框,这样就会让被攻击者察觉。那么怎么…

Cloudera Manager内部结构、功能包括配置文件、目录位置等

2019独角兽企业重金招聘Python工程师标准>>> 问题导读 1.CM的安装目录在什么位置? 2.hadoop配置文件在什么位置? 3.Cloudera manager运行所需要的信息存在什么位置? 4.CM结构和功能是什么? 1. 相关目录 /var/log/cloud…

python 学习笔记(一)

在Windows上安装Python 首先,从Python的官方网站www.python.org下载最新的2.7.9版本,地址是这个: http://www.python.org/ftp/python/2.7.9/python-2.7.9.msi 然后,运行下载的MSI安装包,在选择安装组件的一步时&#x…

Qualcomm QXDM工具简介和log抓取

高通工具简介QXDM 简介QXDM 安装QXDM 激活QXDM 使用AT打开Diagnostic口 QXDM 配置1 Message View ConfigurationMessage PacketsLog PacketsLog PacketsOTAEvent ReportsStrings2 Log View Config3 QXDM-保存配置文件4 QXDM-导入配置文件QPST 端口配置QXDM 抓取log QXDM LOG保存…

layout_gravity

layout_gravity——当前View,本身,在父一级的控件所分配的显示范围内的,对齐方式常用在: 当前控件(在父一级LineLayout所分配给其的显示范围内)的对齐方式需要注意的是,如果TableRow的gravity确…

洗衣机洗涤部分c语言程序,51单片机洗衣机控制板及C语言程序

51单片机洗衣机控制板及C语言程序,该控制板单片机采用AT89C51单片机,所设计全自动洗衣机功能有:标准洗衣、经济洗衣、单独洗衣以及排水四种洗衣等四种方式,有强洗、弱洗及运行/暂停、显示及报警功能,程序利用利用Protues仿真软件观…

犯人释放的C语言程序,C语言的自动关机程序和一个用来整人的小程序

可以用C语言中的system()函数来实现系统的自动关机程序,可以设置多长时间后将自动关机。当然马上关机也是可以的,我们就可以恶搞别人计算机了(你事先得知道怎么解),将写好的自动关机程序复制到别人电脑,然后将可执行的文件设为开机…

图解MapReduceMapReduce整体流程图

1.图解MapReduceMapReduce整体流程图 并行读取文本中的内容&#xff0c;然后进行MapReduce操作 Map过程&#xff1a;并行读取三行&#xff0c;对读取的单词进行map操作&#xff0c;每个词都以<key,value>形式生成 reduce操作是对map的结果进行排序&#xff0c;合并&#…

阿里云推出CloudDBA,解决数据库性能优化和问题诊断难题

问题诊断(trouble shooting) 和 性能优化(performance tunning) 一直都是数据库领域的专业问题&#xff0c;需要资深DBA的专业技能才能胜任解决&#xff0c;但这样的人才是稀缺的&#xff0c;无法及时满足大部分的企业紧急需求。如果有一款产品能够在大多数情况下&#xff0c;用…

初探ArrayList之删除

1.返回删除元素的删除方法 public E remove(int index) {rangeCheck(index);modCount;//记录修改次数的变量E oldValue elementData(index);//根据数组下标拿到指定元素int numMoved size - index - 1;//计算移动位数if (numMoved > 0)System.arraycopy(elementData, inde…

java的三大特性,封装,继承,多态

封装 Java代码 /** * 所谓封装&#xff0c;就是将对象具有的成员变量和成员函数包装和隐藏起来&#xff0c;让外界无法直接使用&#xff0c; * 被封装的成员只能通过某些特定的方式才能访问。 * 实现封装有两个步骤&#xff1a; * 1、将不能暴露的成员隐藏起来&#x…