【iOS】TTTAttributedLabel鏈接點擊

TTTAttributedLabel可以滿足在一段文本內容中展示網址鏈接:

TTTAttributedLabel *label = [TTTAttributedLabel alloc] initWithFrame:frame];
label.delegate = self;
label.enabledTextCheckingTypes = NSTextCheckingTypeLink;
label.numberOfLines = 0;
[self.view  addSubView:label];
IMG_0185.PNG

當然你也可以更改鏈接的樣式:

NSMutableDictionary *linkAttributes = [NSMutableDictionary dictionary];
[linkAttributes setValue:[NSNumber numberWithBool:NO] forKey:(NSString *)kCTUnderlineStyleAttributeName];
[linkAttributes setValue:(__bridge id)ciweiLinkColor.CGColor forKey:(NSString *)kCTForegroundColorAttributeName];
label.linkAttributes = linkAttributes;
IMG_0181.PNG

只需要實現代理方法:

- (void)attributedLabel:(TTTAttributedLabel *)label
   didSelectLinkWithURL:(NSURL *)url{
//這里可以對點擊的url進行操作
}

在很多的社交類軟件包括微信、微博等軟件中常常會遇到下面這樣的需求:


IMG_0183.PNG
在帖子評論中,如果這個評論被回復了(子回復),子回復中的昵稱可點擊并且點擊后一般是去這個用戶的個人主頁面:
NSString *string = [NSString stringWithFormat:@"%@ 回復 %@:%@",reply.nickname,reply.toNickname,reply.content];
label.text = string;
    
NSRange range = NSMakeRange(0, reply.nickname.length);
[self addLinkToURL:[NSURL URLWithString:[NSString stringWithFormat:@"scheme://?type=1&business_id=%@",reply.userId]] withRange:range];

NSRange toRange = NSMakeRange(reply.nickname.length+4, reply.toNickname.length);
[self addLinkToURL:[NSURL URLWithString:[NSString stringWithFormat:@"scheme://?type=1&business_id=%@",reply.toUserId]] withRange:toRange];

因為這里用到時通過點擊連接跳轉到app內部的一個現有頁面,所以這里我傳入的鏈接是Scheme Url,在處理代理方法的時候:

- (void)attributedLabel:(TTTAttributedLabel *)label
   didSelectLinkWithURL:(NSURL *)url{
  NSString *urlStr = [url absoluteString];
  if([urlStr hasPrefix:@"scheme"]){
    [[UIApplication sharedApplication] openURL:url];
  }else{
    //這里可以對點擊的url進行操作
  }
}

然后在AppDelegate中處理點擊昵稱的方法,這里會把昵稱的超鏈接傳入url:

-(BOOL)application:(UIApplication *)application openURL:(NSURL *)url sourceApplication:(NSString *)sourceApplication annotation:(id)annotation{
}

其實大可不必這么費勁,完全可以將其分成兩部分控件:第一部分展示昵稱信息,給其賦予點擊事件;第二部分展示回復文本內容。

但是考慮到,如果是從一個分享網頁中點擊昵稱,需要app作出響應,是的自己的app更加靈活;或者是在回復內容中需要做@某個用戶的操作,為了以后的擴展就這么干了。【仁者見仁】

點擊帖子回復對其進行回復操作:

對label的父控件添加點擊手勢:

UITapGestureRecognizer *tap = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(subReplyClick:)]; 
[view addGestureRecognizer:tap];

但是運行代碼之后發現TTTAttributedLabel的父控件添加手勢之后,其代理方法*attributedLabel:(TTTAttributedLabel *)label
didSelectLinkWithURL:(NSURL )url不再被執行。

解決手勢沖突:

UITapGestureRecognizer *tap = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(subReplyClick:)]; 
tap.delegate = self;
[view addGestureRecognizer:tap];
- (BOOL)gestureRecognizer:(UIGestureRecognizer *)gestureRecognizer shouldReceiveTouch:(UITouch *)touch
{
    if ([touch.view isKindOfClass:[TTTAttributedLabel class]]){
        TTTAttributedLabel *label = (TTTAttributedLabel *)touch.view;
        if ([label containslinkAtPoint:[touch locationInView:label]]){
            return NO;
        }else{
            return YES;
        }
    }else{
        return YES;
    }
}

然后現在就應該是可以了!!!TTTAttributedLabel是一個很強大控件,其他的使用方法以后再說吧。。。

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容

  • 發現 關注 消息 iOS 第三方庫、插件、知名博客總結 作者大灰狼的小綿羊哥哥關注 2017.06.26 09:4...
    肇東周閱讀 12,245評論 4 61
  • 【Photoreading數量】從2016年12月19日起,我已經PR了124本書。 【豆瓣評分】7.2 【個人評...
    有才有閑閱讀 222評論 0 0
  • ――今天,我就要回家。 我看見花草樹木從我眼前飄過, 我看著白的黑的紅的綠的黃的; 我看見滾滾長江翻起層層波浪, ...
    開心鬼鬼閱讀 478評論 0 2
  • 簡以兮 我喜歡用文字記錄自己的一點一滴,哪怕是不開心了,或者感覺自己長大了一丟丟,我都喜歡寫下,這雖然不是什么值得...
    簡以兮閱讀 270評論 0 2
  • 追隨得到的《財富自由之路》專欄快一年了,坦白講,就是奔著財富來的。但一開始就被震撼到了,從最初的懵懂到逐漸的清明,...
    起子先生閱讀 196評論 0 0