YYlabelCopy
前言
最近公司刷題項(xiàng)目重構(gòu),之前刷題是采用富文本渲染,性能極差,業(yè)界大神ibireme的YYKit想必大家都知道,YYText的好用之處我就不再贅述.一開(kāi)始我們是把UIlabel換成YYTextView,為什么不直接換成YYlabel,YYlabel支持異步繪制,因?yàn)槲覀兪亲龉柬?xiàng)目的,試題都要支持復(fù)制,選擇高亮,取消高亮,所以選擇了YYtextView,測(cè)試比之前效果好一點(diǎn),但是還是有點(diǎn)卡頓.因?yàn)閅YtextView的textLayout是私有屬性,每次賦值調(diào)用富文本,都會(huì)有一定的性能開(kāi)銷,所以準(zhǔn)備怎么實(shí)現(xiàn)YYlabe支持復(fù)制,高亮,取消高亮功能
效果圖
[

github下載地址
思路
首先YYlabel是基于coretext繪制的,我在在YYtext中會(huì)發(fā)現(xiàn)一個(gè)類YYTextLayout,YYTextLayout是YYtext的強(qiáng)大之處,里面處理了大量計(jì)算,保存了大量的繪制信息.我們拿到這個(gè)類,就能取到我們想要的一些位置信息.
怎么做才能對(duì)YYtext的入侵比較小呢,這里我采用了分類,去為YYlabel添加一些方法,用關(guān)聯(lián)對(duì)象添加一些屬性.在手勢(shì)點(diǎn)擊的時(shí)候,記錄點(diǎn)擊的位置,當(dāng)手勢(shì)開(kāi)始滑動(dòng)的時(shí)候,彈出放大鏡,在計(jì)算手勢(shì)滑動(dòng)的位置,用CALayer在YYlabel上添加圖層,實(shí)現(xiàn)選中的軌跡,高亮,和取消高亮是YYlabel提供的一個(gè)方法
[text yy_setTextHighlightRange:range
color:[UIColor blueColor]
backgroundColor:[UIColor grayColor]
tapAction:^(UIView *containerView, NSAttributedString *text, NSRange range, CGRect rect){
NSLog(@"tap text range:...");
}]
最終完美實(shí)現(xiàn),目前已在線上穩(wěn)定運(yùn)行,具體使用只需要引入分類頭文件,一行代碼搞定[label addGestureRecognizer]