关于输入页面中键盘表情的设置

来源:互联网 发布:淘宝客服需要什么学历 编辑:程序博客网 时间:2024/06/07 02:31

键盘表情的设置:


再插入新的副文本内容时,需保留旧的副文本,因为副文本只能有一个。它会自动保存其内部文本附件的位置。


通过表情包的Plist文件来生成一个三维数组

三维数组保存着总共有几组表情

二维数组保存着一组有几行表情

一维数组保存着每行都有多少个表情

通过计算的页数 * 每页显示的数量 > 总表情数来判断最后一页有多少个表情

如果大于,就减去之前的所有数量,剩下的就是最后一页的数量

通过生成的三维数组来创建CollectionViewController页面,每组的每个Cell上挂着需要显示的按钮

通常最后一个按钮要空出来作为删除按钮

每个按钮都通过枚举值来计算Tag,枚举值可以更直观的知道按钮是哪个类型的,如浪小花

所有按钮都统一设置,所有按钮都有一个点击事件,点击事件执行的方法为同一个方法

每个按钮都有一个属性,属性为表情详细参数,如果此值被设置就让按钮显示,设置按钮内容

通过按钮的表情类型来判断按钮属于哪一种类型,不同类型的表情可能值得设置方式有所不同

如有的按钮图片通过UIImage生成,有的通过字符串

通过字符串的需要引入NSString的延展类,如:NSString+Emoji来生成Emoji图片

设置完按钮的值保存按钮图片的详细参数

按钮点击事件执行的方法为发布一个通知,通知的参数为按钮自身

随后在当前页面的主控制器里接收通知,通过接收到的通知来执行插入副文本的方法


副文本的设置关键点:

1.根据传入的图片路径创建一个UIImage

2.根据生成的UIImage对象创建也给NSTextAttachment(文本附件)

3.根据NSTextAttachment创建一个NSAttributedString(副文本)

4.把我们的副文本设置给我们的UITextView。attributedText




可通过设置文本附件的Bounds来设置表情的偏移量

若加入的表情需要修改副文本,如图片形式:

一个TextView只能有一个副文本文件,但一个副文本文件可以保存多个附件

在插入表情文件时,应保存一下当前选择的范围

若没有选择则范围为0,不妨碍计算,而后应是将选中的范围内的字符串替换

所以通过记录上一次文本,再对记录的文本进行修改,来添加多表情

若加入的表情不需要副文本,如字符串形式:

可通过inseText直接添加


书写与发送的操作可封装UITextView的一个延展类,在延展类里有一个插入方法与一个属性

插入方法为点击表情按钮时通过参数调用,参数为按钮表情的详细信息

通过参数的类型来判断是图片还是字符串

如果是图片就通过以上四部:

通过图片生成UIImage,UIImage转换成文本文件

文本文件转换成表情副文本,在设置给我们的UITextView


而后发布通知,与使用文本修改的textViewDidChange代理方法,方便主控制器调用代理方法

自己使用自己的代理调用代理方法self.delegate?.textViewDidChange?(self)

插入副文本时若想要光标表情的的后面,需手动设置self.selectedRange的location+1并范围为0

若要替换已选择的范围,也需要获取self.selectedRange,而后通过replaceCharactersInRange替换

也就是替换选中的字符串


若为字符串则直接self.InsertText,会自动发布通知与实现代理方法


副文本设置完毕,发送时需要将副文本的表情转成描述

将描述与字符串拼接成一个整体字符串

也就是延展类的属性设置,此属性为字符串

会遍历TextView的所有文本内容,通过self.attributedText.enumerateAttributesInRange(NSMakeRange(0, self.attributedText.length), options: []) { (infoDic, range, _){ }

获取文本框内的数据infoDic与内容范围range

若为表情,则通过数据InfoDic["NSAttachment"] 即可获取

可转换为自书写的NSTextAttachment延展类中的表情详细信息

通过表情详细信息来获取表情描述

若为字符串直接拼接

遍历完后返回拼接好的字符串方便数据传输


对于接收到的表情描述,可通过封装方法转换成本地表情显示


方法需要接收到的所有文本内容,而后通过正则表达式遍历找到表情描述

正则表达式可通过导入第三方框架RegexKitLite(MRC格式)实现

通过将接收到的文本内容转换成字符串再调用enumerateStringsMatchedByRegex方法

第一个参数为正则表达式匹配的值,可百度查询

对于“  [表情描述] ” 而言,可”\\[[a-zA-Z0-9\\u4e00-\\u9fa5]+\\]" 来描述

对于block里的参数:1. 匹配格式,2 匹配到的内容的指针,3匹配到的值的范围,4. 是否停止的指针

通过内容的memory获取所需字符串,范围的memory获取值得范围

找寻到的内容与范围可通过封装类来保存

可将所有的已保存的值保存到一个数组里用来快速修改

通过数组的倒叙遍历,来调用封装的通过字符串查找表情模型来找到表情模型

查询的方法封装就是遍历所有的表情组中的表情的描述,找到返回 找不到返回nil

而后通过找到的表情生成副文本,在替换文本内容的对应位置的对应值

替换方法:replaceCharactersInRange(range, value)

而后将修改好的文本内容进行显示



对于接收到的文本数据,将其中的表情描述转换成表情的关键点:

 1.通过正则表达式截取到表情字符串

 2.通过表情字符串查找本地表情模型

 3.通过表情模型里面的图片生成副文本来代替原文本的副文本



在表情展示界面时,如要设置页面导航

只需声明一个页面导航,并添加到当前ContentView

而后在CollectionView的滚动中与底部button的点击中设置自身的滚动

页面导航的页数为所在组的页数




0 0
原创粉丝点击