美文网首页IOS收藏iOS开发iOS实用
【iOS】TTTAttributedLabel链接点击

【iOS】TTTAttributedLabel链接点击

作者: 狍子君 | 来源:发表于2016-01-27 11:44 被阅读10094次

    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是一个很强大控件,其他的使用方法以后再说吧。。。

    相关文章

      网友评论

      • again_onceagain:怎么把链接默认的蓝色 改成红色
      • Cherish183:高度是怎么计算 的?
      • 年轻人的心情_爱我所爱:亲,有的时候会存在点击的时候背景偏了,这个是什么原因亲知道不
      • 晓折:我想问一下,这个可以不可以支持某一行的行间距设置呢?
        我现在有这样一个需求,
        有一个字符串, 前面是中文,后面是英文,目前是用\n 来 分割的.
        需求就是\n后面换行开始的文字,行间距要稍微大一点点
        狍子君:NSMutableParagraphStyle *paragrapStyle = [[NSMutableParagraphStyle alloc] init]; [paragrapStyle setLineSpacing:6];
        [attrString addAttribute:NSParagraphStyleAttributeName value:paragrapStyle range:NSMakeRange(0, str.length)];
      • 薛定谔的黑猫警长:怎么不支持首行缩进呢 ?
      • 张月半:为什么我的TTTAttributedLabel没有containslinkAtPoint这个方法。。。
        狍子君:@张月半 https://github.com/TTTAttributedLabel/TTTAttributedLabel/blob/master/TTTAttributedLabel/TTTAttributedLabel.m
        张月半:@狍子君 额还是没 我刚更新到1.2.0版本也没有,请问你是哪个版本
        狍子君:@张月半
        TTTAttributedLabel.m 635行
        - (BOOL)containslinkAtPoint:(CGPoint)point {
        return [self linkAtPoint:point] != nil;
        }
      • Once_Once:TTTAttributedLabel 父试图的点击手势我做了处理 但是链接的代理事件 还会没触发 这个??????
      • 冰三尺:请问, 带有Emoji表情的字符串, 使用TTTAttributedLabel计算高度是,高度不对,行间距也不对, 请问,你是怎么处理的?
        狍子君:@里脊糖醋 第一我并不会计算高度,应为我用的是自动布局,可以看看我写的其他博客,第二关于行距attribute是可以单独设置的,可以根据设计师的要求自己设置行距
      • Qson1:请问上面那微信、微博等软件中常常会遇到下面这样的需求 的Demo有吗 急 目前就在做类似的
      • qbk1989:http://www.baidu.com都必须在 把”都必须在“也是别为url一部分 怎么解决啊
        雪_晟:@qbk1989 嗯 我自己写了 自带的检索网址 不准
        qbk1989:@雪_晟 没有 这个换框架做了 没用这个lable
        雪_晟:请问你解决了吗 我也遇到了这个问题
      • 肆意二货:你好,请问一下我想要实现QQ点赞,点击用户的用户名,在点击的时候文字所在的那一块变成了灰色,怎么实现?
        肆意二货:@狍子君 可以,谢谢啦
        狍子君:@StrangeAndSmile
        你试试这个:
        [linkAttributes setValue:(__bridge id)color.CGColor forKey:kTTTBackgroundFillColorAttributeName];
      • f688592dc653:按楼主这样做的话不知道为啥我点击label想回复时,事件确实能响应但是label加了addLinkToURL的部分会缩小一下,求大神楼主教育一下小弟
      • T_label:可以弱弱的问句如何改变点击选中状态的文字颜色吗,现在默认好像是红色。
        雪_晟: UIColor *active =[UIColor blueColor];
        [activeLinkAttributes setValue:(__bridge id)active.CGColor forKey:(NSString *)kCTForegroundColorAttributeName];
        label.activeLinkAttributes =activeLinkAttributes;
      • 帅哥哥666:这个改变的链接是一段文本里面的所有链接吗
        狍子君:@帅哥哥666 是的
      • 51de76743807:你好,我也在做类似的功能,但是发现使用这个控件以后无法显示表情了,请问你是如何做到显示表情的?
        回味岁月:@aaronlu 我也遇到同样的问题了 表情和html不能同时兼容 请问你怎么解决的 给指点指点
        51de76743807:@狍子君 :好像这个控件只能够显示emoji表情,发现好像不能显示自定义表情,例如微博表情。因为它的NSTextAttachment属性貌似不起作用?
        狍子君:@aaronlu 贴源码看看?
      • 一帆_iOS程序员:发现一个问题
        attributeLabel.enabledTextCheckingTypes = NSTextCheckingTypeLink; // 在文本内容改变时,自动检测链接
        attributeLabel.text = @"http://www.baidu.com";
        设置类型必须放到赋值text上面,不然不起作用
      • cdba9c2c963e:请问有没有源码供参考

      本文标题:【iOS】TTTAttributedLabel链接点击

      本文链接:https://www.haomeiwen.com/subject/cfidkttx.html