开发中,一提到富文本输入框,很多人会想到使用第三方的框架,比如 YYText。我也和大多数人一样,不想重复造轮子,但是我发现很多第三方的功能实在是太多太全了,而我只需要其中的一种而已,于是乎打算自己弄一个玩玩儿。先来看一下效果图。
如何设计呢?富文本其实最主要思想是,把富文本和普通文本一一对应起来。比如富文本是 “undefined”,那么它的普通文本就是“标题”。那么如何把这种关系对应起来呢?
方案一:
1、用一个数组存放富文本的信息(富文本 NSRange ,普通文本中的 NSRange,富文本内容);
2、当用户输入的时候,更新数组中 NSRange 的值;
3、控制光标位置不在富文本范围以内;
4、控制选择范围的起点和终点不在富文本范围以内;
5、调整富文本显示的颜色;
6、获取富文本;
7、获取普通文本。
如何你去实现,2、3、4、5 、6 这几个方法都需要枚举整个数组,而且在更新 NSRange 的时候也比较麻烦,这样的效率是比较低的,因此我实现到 2/3 的时候放弃了,另谋他路,结果还真的被我找到了,那就是方案二。
方案二总结就是三个“一”。一个类,一个属性,一个方法。
一个类: NSMutableAttributedString。
一个属性:该类的 attribute 属性。
attribute 除了支持系统已定义的外,还支持用户自定义的。因此它便可以替代我方案一中数组的作用,并维护富文本的位置信息。
一个方法:- (void)enumerateAttributesInRange:(NSRange)enumerationRange options:(NSAttributedStringEnumerationOptions)opts usingBlock:(void (NS_NOESCAPE ^)(NSDictionary*attrs, NSRange range, BOOL *stop))block NS_AVAILABLE(10_6, 4_0);
这个方法很特殊,主要是看我红框框中的内容,意思是,你可以在枚举的时候随意更改该 Range 内的内容,增、删、改都不会影响它的枚举位置。
方案二:
1、使用 NSMutableAttributedString 来记录富文本信息;
2、使用 NSMutableAttributedString 获取相关富文本信息;
(今天就写到这儿,各位是否已经知道如何做了,明天我再把具体的实现方法贴出来)