在TTTAttributedLabel中指定多个/条件链接颜色

时间:2014-03-10 22:41:15

标签: ios objective-c tttattributedlabel

我在TTTAttributedLabel中添加了一个链接检测器,用于标识@mentions和#hashtags,并在我的TTTAttributedLabel实例中的该位置创建一个链接:

- (void)highlightMentionsInString:(NSString *)text withColor:(UIColor *)color isBold:(BOOL)bold isUnderlined:(BOOL)underlined
{
    NSRegularExpression *mentionExpression = [NSRegularExpression regularExpressionWithPattern:@"(?:^|\\s)(@\\w+)" options:NO error:nil];

    NSArray *matches = [mentionExpression matchesInString:text
                                                  options:0
                                                    range:NSMakeRange(0, [text length])];
    for (NSTextCheckingResult *match in matches) {
        NSRange matchRange = [match rangeAtIndex:1];
        NSString *mentionString = [text substringWithRange:matchRange];
        NSRange linkRange = [text rangeOfString:mentionString];
        NSString* user = [mentionString substringFromIndex:1];
        NSString* linkURLString = [NSString stringWithFormat:@"user:%@", user];
        [self.attributedLabel addLinkToURL:[NSURL URLWithString:linkURLString] withRange:linkRange];
    }
}

我还发现我可以轻松更改链接颜色和属性:

NSArray *keys = [[NSArray alloc] initWithObjects:(id)kCTForegroundColorAttributeName,(id)kCTUnderlineStyleAttributeName
                             , nil];
NSArray *objects = [[NSArray alloc] initWithObjects:color,[NSNumber numberWithInt:kCTUnderlineStyleNone], nil];
NSDictionary *linkAttributes = [[NSDictionary alloc] initWithObjects:objects forKeys:keys];

self.attributedLabel.linkAttributes = linkAttributes;

但是这会改变每个链接属性的颜色 - 包括Web链接,主题标签和提及。有没有办法使用正则表达式或范围创建不同的链接颜色?如果我想要@mentions是灰色的,@ hashtags是红色的,而网络链接是蓝色的话呢?

2 个答案:

答案 0 :(得分:7)

我正在研究类似的问题并遇到了你的问题。我不知道如何注入某种不同的表达式来匹配我的标签中的其他类型的东西,所以你的第一段代码清除了它。

对于您的问题 - 我所做的是将TTTAttributedLabel方法更改为添加NSTextCheckingResult的方法。因此,如果我对该方法中的for循环进行一些更改并使用[self.label addLinkWithTextCheckingResult: attributes: ]并按照建议设置属性,那么现在该循环如下所示:

for (NSTextCheckingResult *match in matches) {
    NSRange matchRange = [match rangeAtIndex:1];
    NSString *mentionString = [text substringWithRange:matchRange];
    NSString* user = [mentionString substringFromIndex:1];
    NSString* linkURLString = [NSString stringWithFormat:@"user:%@", user];
    NSArray *keys = [[NSArray alloc] initWithObjects:(id)kCTForegroundColorAttributeName, (id)kCTUnderlineStyleAttributeName, nil];
    NSArray *objects = [[NSArray alloc] initWithObjects:color,[NSNumber numberWithInt:kCTUnderlineStyleNone], nil];
    NSDictionary *linkAttributes = [[NSDictionary alloc] initWithObjects:objects forKeys:keys];
    [self.label addLinkWithTextCheckingResult:match attributes:linkAttributes];
}

就我而言,这将以烤橙色显示#和@。

然后我的TTTAttributedLabelDelegate中有- (void)attributedLabel:(TTTAttributedLabel *)label didSelectLinkWithTextCheckingResult:(NSTextCheckingResult *)result TTTAttributedLabelDelegate方法。当一个人点击#或@文本时,用NSTextCheckingResult调用它。

这是你在找什么?

答案 1 :(得分:0)

由于关于突出显示的链接状态的问题尚未得到解答,这里有一个简单的解决方案:

var attrs = [NSFontAttributeName : UIFont.systemFontOfSize(14.0), NSForegroundColorAttributeName: UIColor.blackColor()]
label.activeLinkAttributes = attrs