iOS提取文本中鏈接添加高亮點(diǎn)擊凹耙,String NSString 對(duì)于表情NSRange計(jì)算長(zhǎng)度不同,YYTextHighlight手勢(shì)沖突問(wèn)題

直接上代碼肠仪,通過(guò)以下計(jì)算就可以完成鏈接的識(shí)別以及替換肖抱,然后添加高亮以及對(duì)高亮文字添加點(diǎn)擊事件

let label = YYLabel()
        label.backgroundColor = .red
        label.numberOfLines = 0
        label.preferredMaxLayoutWidth = 200
        view.addSubview(label)
        label.snp.makeConstraints { (make) in
            make.left.equalTo(50)
            make.width.equalTo(200)
            make.top.equalTo(300)
        }
        
        var urls: [String] = []
        
        var string = "test\\n\ntest/\\n\n??\nhttps://mbd.baidu.com/newspage/data/landingsuper?context=%7B%22nid%22%3A%22news_9827769369551786176%22%7D&n_type=0&p_from=1 第二個(gè) https://weibo.com/mygroups?gid=201209041125312675&wvr=6&leftnav=1&isspecialgroup=1 今天又是好天氣!今天又是好天氣异旧!今天又是好天氣意述!今天又是好天氣!今天又是好天氣吮蛹!";
        
//        var string = "est\\n\ntest/\\n\n??\nhttps://www.weibo.com/beat/beatslist/beat?keyword=測(cè)試 https://weibo.com/mygroups?gid=201209041125312675&wvr=6&leftnav=1&isspecialgroup=1 每天都很美好";

        let detector = try? NSDataDetector.init(types: NSTextCheckingResult.CheckingType.link.rawValue)
        let matches = detector?.matches(in: string, options: [.reportProgress], range: NSRange(location: 0, length: string.count))
        for match in matches! {
            if match.resultType == .link {
                if let url = match.url {
                    //這里獲取到的url是經(jīng)過(guò)encode處理的
                    urls.append(url.absoluteString)
                }
            }
        }
        
        print("encode urls \(urls)")
        
        let font = UIFont.systemFont(ofSize: 15)
        let attribbutes = NSMutableAttributedString(string: "")
        for str in urls {
           
            var strArray = string.components(separatedBy: str)
            if strArray.count < 2 {
                //如果沒(méi)有匹配到字符說(shuō)明string沒(méi)有經(jīng)過(guò)encode欲险,但是str為encode以后的字符,所以需要decode str才能識(shí)別
                if let decode = str.removingPercentEncoding {
                    strArray = string.components(separatedBy: decode)
                }
            }
            if let firstStr = strArray.first {
                let subAttribute = NSMutableAttributedString(string: firstStr)
                subAttribute.setColor(.cyan, range: NSRange(location: 0, length: firstStr.count))
                attribbutes.append(subAttribute)
                
                let hightText = YYTextHighlight()
                hightText.tapAction = { view, text, range, rect in
                    guard let url = URL(string: str) else {
                        print("error url \(str)")
                        return
                    }
                    print("open url \(url)")
                    UIApplication.shared.open(url, options: [:], completionHandler: nil)
                }
                
                let imageAttribute = NSMutableAttributedString.attachmentString(withContent: UIImage(named: "commend_kink"), contentMode: .scaleAspectFit, attachmentSize: .init(width: 18, height: 18), alignTo: font, alignment: .center)
                let replaceStr = NSMutableAttributedString(string: "查看鏈接")
                replaceStr.setColor(.yellow, range: NSRange(location: 0, length: 4))
                imageAttribute.append(replaceStr)
                imageAttribute.setTextHighlight(hightText, range: NSRange(location: 0, length: 5))
                attribbutes.append(imageAttribute)
            }
            
            if let lastStr = strArray.last {
                string = lastStr
            }
            
        }
        let lastAttribute = NSMutableAttributedString(string: string)
        lastAttribute.setColor(.cyan, range: NSRange(location: 0, length: string.count))
        attribbutes.append(lastAttribute)
        
        label.attributedText = attribbutes
注意點(diǎn)YYLabel UILabel用法差異

使用YYLabel和使用UILabel還是有一些區(qū)別的匹涮。如果使用UILabel設(shè)置了lable的font、textColor槐壳,在給label的text賦值或者attributedText賦值時(shí)然低,上述設(shè)置都會(huì)生效。但是YYLabel設(shè)置font务唐、textColor只會(huì)對(duì)label的text生效雳攘,對(duì)于attributedText屬性必須對(duì)NSAttributedString、NSMutableAttributedString進(jìn)行設(shè)置枫笛。

YYLabel高度自適應(yīng) preferredMaxLayoutWidth

對(duì)于UIlabel僅設(shè)置label.numberOfLines = 0吨灭,并且不設(shè)置高度lable就會(huì)隨著顯示內(nèi)容自動(dòng)增長(zhǎng),但是對(duì)于YYLable除了設(shè)置label.numberOfLines = 0刑巧,還要設(shè)置label.preferredMaxLayoutWidth喧兄,只有這樣YYLabel才會(huì)自增長(zhǎng)。

String NSString 對(duì)于表情NSRange計(jì)算長(zhǎng)度不同

由下圖可以看出對(duì)于純文字不管是String類(lèi)型NSString計(jì)算結(jié)果都一樣啊楚。但是對(duì)于含有表情的文本計(jì)算吠冤,兩者計(jì)算結(jié)果不一樣。對(duì)于這種情況可以使用NSString計(jì)算也可以使用String調(diào)用.utf16.coun計(jì)算恭理。NSString默認(rèn)使用utf16計(jì)算拯辙,而表情大部分也需要使用utf16計(jì)算,所以直接使用NSString就可以得到正確的結(jié)果颜价。

 let range = NSMakeRange(0, string.count)
 let nsStr = string as NSString
 let conTentRange = NSMakeRange(0, nsStr.length)
 //let conTentRange = NSMakeRange(0, string.utf16.count)
 printf("range \(range) conTentRange \(conTentRange)  text \(text)")
image
YYTextHighlight和父視圖手勢(shì)會(huì)沖突問(wèn)題
func gestureRecognizer(_ gestureRecognizer: UIGestureRecognizer, shouldReceive touch: UITouch) -> Bool {
        //YYTextHighlight和父視圖手勢(shì)會(huì)沖突涯保,所以需要識(shí)別點(diǎn)擊位置是否包含YYTextHighlight
        if touch.view is YYLabel {
            let label = touch.view as? YYLabel
            if let label = label {
                var range = NSMakeRange(0, 1);
                let highlight = label._getHighlight(at: touch.location(in: label), range: &range)
                if highlight != nil {
                    return false
                }
            }
        }
        return true
    }

上邊代碼中-(YYTextHighlight *)_getHighlightAtPoint:(CGPoint)point range:(NSRangePointer)range;為私有方法,外部不可調(diào)用周伦,又考慮到引用的是別人的第三方庫(kù)夕春,所以需要?jiǎng)?chuàng)建一個(gè)YYLabel的分來(lái),然后將此方法在YYLabel分類(lèi)的.h中聲明专挪。如下:

#import "YYLabel.h"

NS_ASSUME_NONNULL_BEGIN

@interface YYLabel (YHYYLabel)

- (YYTextHighlight *)_getHighlightAtPoint:(CGPoint)point range:(NSRangePointer)range;

@end

NS_ASSUME_NONNULL_END

本人原文博客地址

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末撇他,一起剝皮案震驚了整個(gè)濱河市茄猫,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌困肩,老刑警劉巖划纽,帶你破解...
    沈念sama閱讀 218,941評(píng)論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異锌畸,居然都是意外死亡勇劣,警方通過(guò)查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,397評(píng)論 3 395
  • 文/潘曉璐 我一進(jìn)店門(mén)潭枣,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)比默,“玉大人,你說(shuō)我怎么就攤上這事盆犁∶溃” “怎么了?”我有些...
    開(kāi)封第一講書(shū)人閱讀 165,345評(píng)論 0 356
  • 文/不壞的土叔 我叫張陵谐岁,是天一觀的道長(zhǎng)醋奠。 經(jīng)常有香客問(wèn)我,道長(zhǎng)伊佃,這世上最難降的妖魔是什么窜司? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 58,851評(píng)論 1 295
  • 正文 為了忘掉前任,我火速辦了婚禮航揉,結(jié)果婚禮上塞祈,老公的妹妹穿的比我還像新娘。我一直安慰自己帅涂,他們只是感情好议薪,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,868評(píng)論 6 392
  • 文/花漫 我一把揭開(kāi)白布。 她就那樣靜靜地躺著媳友,像睡著了一般笙蒙。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上庆锦,一...
    開(kāi)封第一講書(shū)人閱讀 51,688評(píng)論 1 305
  • 那天捅位,我揣著相機(jī)與錄音,去河邊找鬼搂抒。 笑死艇搀,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的求晶。 我是一名探鬼主播焰雕,決...
    沈念sama閱讀 40,414評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼芳杏!你這毒婦竟也來(lái)了矩屁?” 一聲冷哼從身側(cè)響起辟宗,我...
    開(kāi)封第一講書(shū)人閱讀 39,319評(píng)論 0 276
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎吝秕,沒(méi)想到半個(gè)月后泊脐,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,775評(píng)論 1 315
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡烁峭,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,945評(píng)論 3 336
  • 正文 我和宋清朗相戀三年容客,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片约郁。...
    茶點(diǎn)故事閱讀 40,096評(píng)論 1 350
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡缩挑,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出鬓梅,到底是詐尸還是另有隱情供置,我是刑警寧澤,帶...
    沈念sama閱讀 35,789評(píng)論 5 346
  • 正文 年R本政府宣布绽快,位于F島的核電站芥丧,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏谎僻。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,437評(píng)論 3 331
  • 文/蒙蒙 一寓辱、第九天 我趴在偏房一處隱蔽的房頂上張望艘绍。 院中可真熱鬧,春花似錦秫筏、人聲如沸诱鞠。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 31,993評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)航夺。三九已至,卻和暖如春崔涂,著一層夾襖步出監(jiān)牢的瞬間阳掐,已是汗流浹背。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 33,107評(píng)論 1 271
  • 我被黑心中介騙來(lái)泰國(guó)打工冷蚂, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留缭保,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 48,308評(píng)論 3 372
  • 正文 我出身青樓蝙茶,卻偏偏與公主長(zhǎng)得像艺骂,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子隆夯,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,037評(píng)論 2 355

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

  • 為什么要做這個(gè)筆記 masonry [https://github.com/SnapKit/Masonry]可以說(shuō)...
    blackie_james閱讀 704評(píng)論 0 0
  • 利用NSAttributedString (富文本)能調(diào)整UILable等文字相關(guān)控件顯示文字的字體钳恕、顏色别伏、字體間...
    Sweet丶閱讀 2,357評(píng)論 0 0
  • Auto Layout 是怎么進(jìn)行自動(dòng)布局的,性能如何忧额? Auto Layout 到底是如何實(shí)現(xiàn)自動(dòng)布局的厘肮,這種布...
    為了自由的白菜閱讀 276評(píng)論 0 0
  • 16宿命:用概率思維提高你的勝算 以前的我是風(fēng)險(xiǎn)厭惡者,不喜歡去冒險(xiǎn)宙址,但是人生放棄了冒險(xiǎn)轴脐,也就放棄了無(wú)數(shù)的可能。 ...
    yichen大刀閱讀 6,052評(píng)論 0 4
  • 公元:2019年11月28日19時(shí)42分農(nóng)歷:二零一九年 十一月 初三日 戌時(shí)干支:己亥乙亥己巳甲戌當(dāng)月節(jié)氣:立冬...
    石放閱讀 6,880評(píng)論 0 2