YYKit之YYLabel

weixin_34120274發表於2017-11-14

本文只對富文字中部分文字新增點選事件做簡單介紹

1.新增點選事件

YYLabel中給部分文字新增點選事件主要是在富文字排版的時候,建立YYTextHighlight物件,設定Range,並可以可以給他賦值一個JSON字典以便在之後點選文字之後可以獲取到內容(如@{@"action":@"comment"}).
設定YYTextHighlight的時候同時可以設定YYTextBorder,也就是背景顏色以及圓角等等,再點選的時候看起來不會顯得空洞,有直觀的反饋
設定富文字的程式碼如下

    NSString *showStr = @"我有一頭小毛驢,從來也不騎~~";
    NSMutableAttributedString *authorSayAtt = [[NSMutableAttributedString alloc] initWithString:showStr];
    [authorSayAtt setColor:[UIColor blackColor]];
    //YYTextBorder設定點選的背景顏色,圓角
    YYTextBorder *textBoder = [YYTextBorder new];
    textBoder.insets = UIEdgeInsetsMake(0, 0, 0, 0);
    textBoder.cornerRadius = 5;
    textBoder.fillColor = UIColorFromRGB(0xd7d7d7);
    //給文字設定Highlight
    YYTextHighlight *hightLight = [YYTextHighlight new];
    [hightLight setBackgroundBorder:textBoder];
    [authorSayAtt setTextHighlight:hightLight range:[showStr rangeOfString:@"毛驢"]];
    YYTextContainer *container = [[YYTextContainer alloc] init];
    container.size = CGSizeMake(windWidth-kReaderLeftSpace*2, CGFLOAT_MAX);
    YYTextLayout *layout = [YYTextLayout layoutWithContainer:container text:authorSayAtt];
    //此處的YYTextLayout可以計算富文字的高度,他有一個屬性textBoundingRect和textBoundingSize,container.size是用來限制寬度的,可以計算高度
    //YYTextLayout是用來賦值給YYLabel,相當於UILabel的attributedText
    //如果單純的做點選處理可以用attributedText直接賦值給YYLabel,但是如果需要非同步渲染就必須用YYTextLayout

然後在初始化YYLabel的地方,呼叫YYLabel的highlightTapAction屬性就可以獲取到點選的區域,文字資訊等

-(YYLabel *)authorSayLabel
{
    if (!_authorSayLabel) {
        _authorSayLabel = [[YYLabel alloc] init];
        _authorSayLabel.highlightTapAction = ^(UIView * _Nonnull containerView, NSAttributedString * _Nonnull text, NSRange range, CGRect rect) {
            
            YYLabel *useLabel = (YYLabel *)containerView;
            NSAttributedString *attribute = useLabel.textLayout.text;
            if (range.location >= text.length) {
                return ;
            }
            YYTextHighlight *heightLight = [attribute attribute:YYTextHighlightAttributeName atIndex:range.location];
            NSDictionary *dic = heightLight.userInfo;
            DLog(@"攜帶的值===%@",dic);
            //此處的dic,就是之前設定富文字時的字典
        };
    }
    return _authorSayLabel;
}

2.關於YYLabel設定點選事件不響應的問題,主要有幾個方面

(1).頁面是否有其他的手勢,例如UITapGestureRecognizer,如果有,需要設定其屬性cancelsTouchesInView和delaysTouchesBegan都為NO
(2).YYLabel是否新增在了滑動檢視上面,如果是需要設定滑動檢視的屬性delaysContentTouches為NO(canCancelContentTouches預設為YES,不需改動)
(3).YYLabel新增在了滑動檢視上(如UIScrollVIew上),並且滑動檢視上還有UITapGestureRecognizer手勢,這個時候需要同時設定以上設定的三個屬性,否則有一種奇怪現象,點選文字的時候如果輕點會先走UITapGestureRecognizer的方法,再走YYLabel的highlightTapAction點選事件(右或者不走),稍用力點選才能夠正常先走YYLabel的highlightTapAction,再觸發UITapGestureRecognizer的事件方法

相關文章