在實(shí)際的項(xiàng)目開發(fā)過(guò)程中,我們經(jīng)常會(huì)遇到這樣的一些設(shè)計(jì),如下圖

十個(gè)App得有九個(gè)是這樣的,要求點(diǎn)擊"XXX協(xié)議",就跳轉(zhuǎn)到一個(gè)協(xié)議的頁(yè)面,通常我們會(huì)有兩種辦法去處理這樣的情況:
1、懶人派:不喜歡折騰,就去用兩個(gè)控件(UILabel + xxx),分別去顯示前面不可點(diǎn)擊部分和后面可點(diǎn)擊部分。
這樣很快的就搞定了,但是是真的搞定了嗎?往下看,這樣做會(huì)有坑的。
2、勤勞派:自己總結(jié)出一個(gè)實(shí)現(xiàn)方式,采用富文本+自定義顯示控件的方法來(lái)一勞永逸。
好了,先說(shuō)懶人派那樣做的坑吧,且不說(shuō)布局麻煩了(UILabel和UIButton對(duì)不齊),就說(shuō)適配問(wèn)題吧,假如,后面那幾個(gè)字在某一寬度的手機(jī)上,正好出現(xiàn)換行情況怎么辦?顯示還得照常顯示吧,點(diǎn)擊還的照常點(diǎn)擊吧?;旧蠅蚝纫粔亓恕?/p>

1、在點(diǎn)擊范圍未出現(xiàn)換行情況下,點(diǎn)擊標(biāo)紅色字體,跳轉(zhuǎn)到用戶協(xié)議頁(yè)面。
2、在點(diǎn)擊范圍出現(xiàn)換行的情況下,點(diǎn)擊標(biāo)紅色字體,仍然跳轉(zhuǎn)到用戶協(xié)議頁(yè)面。
所以,懶人一下子就燥起來(lái)了,措手不及,防不勝防!
所以,懶人們還是勤快點(diǎn)吧,開發(fā)過(guò)程我們還是多思考一下,一勞永逸才是懶人之道。

實(shí)現(xiàn)思路:使用UITextView的selectionRectsForRange方法來(lái)獲取需要點(diǎn)擊跳轉(zhuǎn)部分的Rect(數(shù)組),然后重寫View的touchesBegan,判斷觸摸點(diǎn)是否在Rect內(nèi),若都不在則未命中,否則,則命中。
使用富文本+自定義顯示控件搞定了,使用起來(lái)特別的方便簡(jiǎn)單。代碼中已經(jīng)注釋很清楚了,保證看一眼你就會(huì)了。此demo實(shí)現(xiàn)了富文本點(diǎn)擊跳轉(zhuǎn),這一點(diǎn)在開發(fā)過(guò)程中,會(huì)衍生出很多應(yīng)用場(chǎng)景,不妨自己總結(jié)一下,觸類旁通。
demo的地址:https://github.com/SpringAndSummer/CoreTextJump/tree/master