Укажите несколько / условные цвета ссылок в 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;

Но это меняет цвета для каждого атрибута ссылки, включая веб-ссылки, хэштеги и упоминания. Есть ли способ создать разные цвета ссылок, используя регулярное выражение или диапазон? Скажите, если бы я хотел, чтобы @mentions были серыми, @hashtags - красными, а веб-ссылки - голубыми?

2 ответа

Решение

Я просто работал над похожей проблемой и наткнулся на ваш вопрос. Я не знал точно, как внедрить какие-то различные выражения, чтобы соответствовать другим видам вещей в моем ярлыке, поэтому ваш первый фрагмент кода прояснил это.

Однако, на ваш вопрос - я изменил метод 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];
}

В моем случае это покажет # и @ в поджаренном апельсине.

И тогда у меня есть - (void)attributedLabel:(TTTAttributedLabel *)label didSelectLinkWithTextCheckingResult:(NSTextCheckingResult *)result TTTAttributedLabelDelegate метод в моем TTTAttributedLabelDelegate. Это вызывается с NSTextCheckingResult, когда кто-то нажимает на текст # или @.

Это то, что ты искал?

Поскольку на вопрос о выделенном состоянии ссылок еще не ответили, вот простое решение:

var attrs = [NSFontAttributeName : UIFont.systemFontOfSize(14.0), NSForegroundColorAttributeName: UIColor.blackColor()]
label.activeLinkAttributes = attrs
Другие вопросы по тегам