使用UITextView設(shè)置超鏈接

遇到的坑坑坑

下面說下在使用UITextView設(shè)置超鏈接時(shí)遇到的坑。
UITextView可以通過設(shè)置富文本的方式進(jìn)行超鏈接的設(shè)置萄唇。但是,UITextView默認(rèn)有諸多手勢,在長按時(shí)會(huì)出現(xiàn)菜單姓赤,放大鏡,選中文本幾種狀態(tài)仲吏,但是并不想要這三種狀態(tài)啊不铆。
為了取消菜單狀態(tài)可以這么做:

- (BOOL)canPerformAction:(SEL)action withSender:(id)sender
{
    return NO;
}

為了取消算中狀態(tài)可以通過textView的代理來實(shí)現(xiàn),一直將設(shè)置范圍重置為0裹唆,如下:

- (void)textViewDidChangeSelection:(UITextView *)textView
{
    _textView.selectedRange = NSMakeRange(0, 0);
}

為了取消放大鏡狀態(tài)嘗試了各種方法誓斥,比如不同時(shí)機(jī)注銷第一響應(yīng)等,但是都沒用许帐。(如果有請(qǐng)麻煩告訴我劳坑,謝謝),但是這三種狀態(tài)肯定都是通過去手勢完成的成畦,所以想到了最終方法距芬,找到對(duì)應(yīng)手勢,將手勢刪除羡鸥。
大概可以這么做:

NSArray *textViewGestureRecognizers = self.textView.gestureRecognizers;
    NSMutableArray *mutableArrayOfGestureRecognizers = [[NSMutableArray alloc] init];
    for (UIGestureRecognizer *gestureRecognizer in textViewGestureRecognizers) {
        if (![gestureRecognizer isKindOfClass:[UILongPressGestureRecognizer class]]) {
            [mutableArrayOfGestureRecognizers addObject:gestureRecognizer];
        } else {
            UILongPressGestureRecognizer *longPressGestureRecognizer = (UILongPressGestureRecognizer *)gestureRecognizer;
            if (longPressGestureRecognizer.minimumPressDuration < 0.5) {
                [mutableArrayOfGestureRecognizers addObject:gestureRecognizer];
            }
        }
    }
    self.textView.gestureRecognizers = mutableArrayOfGestureRecognizers;

但是手勢太多了蔑穴,可能會(huì)誤移除,將來誰知道蘋果會(huì)怎么變惧浴,所以哪天手勢稍有改動(dòng)萬一上線了出了問題存和,不得被老大罵死啊。
然后決定使用TTTAttributedLabel來做這個(gè)需求衷旅,但是TTTAttributedLabel這玩意在我這布局總不對(duì)捐腿,通過debug發(fā)現(xiàn)繪制也是從0,0開始繪制的柿顶,實(shí)際出來卻不是從0茄袖,0繪制,要偏上一些嘁锯,github主頁發(fā)現(xiàn)也有人碰到了類似問題宪祥,最后決定放棄使用TTTAttributedLabel了聂薪,還是使用UITextView自己通過計(jì)算鏈接區(qū)域來搞吧,也順便將來應(yīng)對(duì)圖文混排需求蝗羊;

解決方案

下面大概說下思路藏澳,具體可見demo;

  1. 首先需要設(shè)置下面兩個(gè)屬性為NO
textView.editable = NO;
textView.selectable = NO;

2.然后需要根據(jù)超鏈接的點(diǎn)擊范圍計(jì)算點(diǎn)擊矩形區(qū)域耀找,由于可能換行翔悠,所以返回?cái)?shù)組,假設(shè)點(diǎn)擊區(qū)域保存在self.respondRects

- (NSArray *)respondRectsFromRange:(NSRange)range
{
    UITextPosition *beginning = _textView.beginningOfDocument;
    UITextPosition *rangeStart = [_textView positionFromPosition:beginning offset:range.location];
    UITextPosition *rangeEnd = [_textView positionFromPosition:rangeStart offset:range.length];
    UITextRange *textRange = [_textView textRangeFromPosition:rangeStart toPosition:rangeEnd];
    NSArray *ranges = [_textView selectionRectsForRange:textRange];
    NSMutableArray *respondRects = [NSMutableArray array];
    for (UITextSelectionRect *selectionRect in ranges) {
        CGRect rect = selectionRect.rect;
        if (rect.size.width > 0 && rect.size.height > 0) {
            [respondRects addObject:NSStringFromCGRect([_textView convertRect:rect toView:_textView.superview])];
        }
    }
    return respondRects;
}
  1. 添加longPress手勢野芒,并設(shè)置minimumPressDuration = 0.01f; 設(shè)置0.01s是為了在模擬tap手勢蓄愁,在快速點(diǎn)擊鏈接時(shí)也會(huì)做出響應(yīng);
  2. 在LongPress.state == UIGestureRecognizerStateEnded時(shí)判斷點(diǎn)擊的點(diǎn)是否在respondRects區(qū)域狞悲,是則進(jìn)行相應(yīng)撮抓;

源碼示例SFTextLinkView

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市效诅,隨后出現(xiàn)的幾起案子胀滚,更是在濱河造成了極大的恐慌,老刑警劉巖乱投,帶你破解...
    沈念sama閱讀 206,214評(píng)論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件咽笼,死亡現(xiàn)場離奇詭異,居然都是意外死亡戚炫,警方通過查閱死者的電腦和手機(jī)剑刑,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,307評(píng)論 2 382
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來双肤,“玉大人施掏,你說我怎么就攤上這事∶┟樱” “怎么了七芭?”我有些...
    開封第一講書人閱讀 152,543評(píng)論 0 341
  • 文/不壞的土叔 我叫張陵,是天一觀的道長蔑赘。 經(jīng)常有香客問我狸驳,道長,這世上最難降的妖魔是什么缩赛? 我笑而不...
    開封第一講書人閱讀 55,221評(píng)論 1 279
  • 正文 為了忘掉前任耙箍,我火速辦了婚禮,結(jié)果婚禮上酥馍,老公的妹妹穿的比我還像新娘辩昆。我一直安慰自己,他們只是感情好旨袒,可當(dāng)我...
    茶點(diǎn)故事閱讀 64,224評(píng)論 5 371
  • 文/花漫 我一把揭開白布汁针。 她就那樣靜靜地躺著术辐,像睡著了一般。 火紅的嫁衣襯著肌膚如雪扇丛。 梳的紋絲不亂的頭發(fā)上术吗,一...
    開封第一講書人閱讀 49,007評(píng)論 1 284
  • 那天,我揣著相機(jī)與錄音帆精,去河邊找鬼。 笑死隧魄,一個(gè)胖子當(dāng)著我的面吹牛卓练,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播购啄,決...
    沈念sama閱讀 38,313評(píng)論 3 399
  • 文/蒼蘭香墨 我猛地睜開眼襟企,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了狮含?” 一聲冷哼從身側(cè)響起顽悼,我...
    開封第一講書人閱讀 36,956評(píng)論 0 259
  • 序言:老撾萬榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎几迄,沒想到半個(gè)月后蔚龙,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 43,441評(píng)論 1 300
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡映胁,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 35,925評(píng)論 2 323
  • 正文 我和宋清朗相戀三年木羹,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片解孙。...
    茶點(diǎn)故事閱讀 38,018評(píng)論 1 333
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡坑填,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出弛姜,到底是詐尸還是另有隱情脐瑰,我是刑警寧澤,帶...
    沈念sama閱讀 33,685評(píng)論 4 322
  • 正文 年R本政府宣布廷臼,位于F島的核電站苍在,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏中剩。R本人自食惡果不足惜忌穿,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,234評(píng)論 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望结啼。 院中可真熱鬧掠剑,春花似錦、人聲如沸郊愧。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,240評(píng)論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至眠寿,卻和暖如春躬翁,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背盯拱。 一陣腳步聲響...
    開封第一講書人閱讀 31,464評(píng)論 1 261
  • 我被黑心中介騙來泰國打工盒发, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人狡逢。 一個(gè)月前我還...
    沈念sama閱讀 45,467評(píng)論 2 352
  • 正文 我出身青樓宁舰,卻偏偏與公主長得像,于是被迫代替她去往敵國和親奢浑。 傳聞我的和親對(duì)象是個(gè)殘疾皇子蛮艰,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 42,762評(píng)論 2 345

推薦閱讀更多精彩內(nèi)容

  • 發(fā)現(xiàn) 關(guān)注 消息 iOS 第三方庫、插件雀彼、知名博客總結(jié) 作者大灰狼的小綿羊哥哥關(guān)注 2017.06.26 09:4...
    肇東周閱讀 12,022評(píng)論 4 62
  • 石根壤蚜,白狗,蘭蘭徊哑,羅子袜刷,何文清,湖北佬 還有愛情实柠,欲望水泉,生活,農(nóng)村窒盐, 為什么找不到一個(gè)詞可以來形容陜西農(nóng)村的這種純...
    鱒魚大人閱讀 858評(píng)論 0 0
  • 明天小家伙就有38周了草则。健健康康的小寶貝你準(zhǔn)備好了嗎?要來到這個(gè)世界了蟹漓,麻麻好期待炕横!每天都是瞌睡比較多,下雨天懶懶...
    Daa大琳閱讀 127評(píng)論 0 0
  • 陳舊的大門透著詭異的神秘 我們就在那里相遇 那場大雨夾著夏末殘存的熱烈 濕了一身的迷彩 別跑的那么專注 快撿起你掉...
    書晴sq閱讀 316評(píng)論 7 7
  • 清朝末年葡粒,北京城里的八旗弟子日子過的很是“幸阜莸睿”,抽鴉片嗽交,架鳥籠卿嘲,玩票,玩女人夫壁,和今天的富二代沒什么區(qū)別拾枣,也不會(huì)騎...
    機(jī)智的小朋同學(xué)閱讀 806評(píng)論 0 0