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