? 開發(fā)中厦坛,一提到富文本輸入框五垮,很多人會(huì)想到使用第三方的框架,比如 YYText杜秸。我也和大多數(shù)人一樣放仗,不想重復(fù)造輪子,但是我發(fā)現(xiàn)很多第三方的功能實(shí)在是太多太全了撬碟,而我只需要其中的一種而已诞挨,于是乎打算自己弄一個(gè)玩玩兒。先來看一下效果圖呢蛤。
? 如何設(shè)計(jì)呢惶傻?富文本其實(shí)最主要思想是,把富文本和普通文本一一對(duì)應(yīng)起來其障。比如富文本是 “undefined”银室,那么它的普通文本就是“標(biāo)題”。那么如何把這種關(guān)系對(duì)應(yīng)起來呢静秆?
方案一:
1粮揉、用一個(gè)數(shù)組存放富文本的信息(富文本 NSRange ,普通文本中的 NSRange,富文本內(nèi)容)抚笔;
2扶认、當(dāng)用戶輸入的時(shí)候,更新數(shù)組中 NSRange 的值殊橙;
3辐宾、控制光標(biāo)位置不在富文本范圍以內(nèi);
4膨蛮、控制選擇范圍的起點(diǎn)和終點(diǎn)不在富文本范圍以內(nèi)叠纹;
5、調(diào)整富文本顯示的顏色敞葛;
6誉察、獲取富文本;
7惹谐、獲取普通文本持偏。
? 如何你去實(shí)現(xiàn),2氨肌、3鸿秆、4、5 怎囚、6 這幾個(gè)方法都需要枚舉整個(gè)數(shù)組卿叽,而且在更新 NSRange 的時(shí)候也比較麻煩,這樣的效率是比較低的,因此我實(shí)現(xiàn)到 2/3 的時(shí)候放棄了考婴,另謀他路贩虾,結(jié)果還真的被我找到了,那就是方案二蕉扮。
? 方案二總結(jié)就是三個(gè)“一”整胃。一個(gè)類,一個(gè)屬性喳钟,一個(gè)方法。? ? ?
?一個(gè)類: NSMutableAttributedString在岂。??
? 一個(gè)屬性:該類的 attribute 屬性奔则。
? attribute 除了支持系統(tǒng)已定義的外,還支持用戶自定義的蔽午。因此它便可以替代我方案一中數(shù)組的作用易茬,并維護(hù)富文本的位置信息。 ? ? ?
一個(gè)方法:- (void)enumerateAttributesInRange:(NSRange)enumerationRange options:(NSAttributedStringEnumerationOptions)opts usingBlock:(void (NS_NOESCAPE ^)(NSDictionary*attrs, NSRange range, BOOL *stop))block NS_AVAILABLE(10_6, 4_0);
? 這個(gè)方法很特殊及老,主要是看我紅框框中的內(nèi)容抽莱,意思是,你可以在枚舉的時(shí)候隨意更改該 Range 內(nèi)的內(nèi)容骄恶,增食铐、刪、改都不會(huì)影響它的枚舉位置僧鲁。
方案二:
1虐呻、使用 NSMutableAttributedString 來記錄富文本信息;
2寞秃、使用 NSMutableAttributedString 獲取相關(guān)富文本信息斟叼;
(今天就寫到這兒,各位是否已經(jīng)知道如何做了春寿,明天我再把具體的實(shí)現(xiàn)方法貼出來)