TTTAttributedLabelで訪問済みのリンクテキストの色を未訪問のものと区別する方法

TTTAttributedLabelで指定した範囲の文字にURLを指定してリンクにするには以下の様にaddLinkToURL:withRangeを利用します。

TTTAttributedLabel *label;
...
[label addLinkToURL:[NSURL URLWithString:@"http://github.com/"] withRange:range]}; 

addLinkToURL:withRangeを利用して適用したリンクには、linkAttributesで指定した属性が自動的に付与されます。

// リンク色をすべて青色にする
label.linkAttributes = @{NSForegroundColorAttributeName : [UIColor blueColor]};

activeLinkAttributesでタップしたり長押しした際のリンク色を設定できます。

// 選択時のリンク色をすべて赤色にする
label.linkAttributes = @{NSForegroundColorAttributeName : [UIColor redColor]};

addLinkToURL:withRangeを使う場合は上記の2つが適用されるため、訪問済みのリンクの場合だけ色を変えたりといったことができません。そこで、addLinkToURL:withRangeを使わずにaddLinkWithTextCheckingResult:attributes:メソッドを使ってリンクを設定することで訪問済みの場合だけ色を変えることができます。

以下、サンプル

NSURL *url = [NSURL URLWithString:@"https://github.com"];
...
NSDictionary *visitedLinkAttributes = @{NSForegroundColorAttributeName : [UIColor purpleColor]}
if ([visitor isVisited:url]) {
    // 訪問済みのリンクはリンク色を紫に
    [label addLinksWithTextCheckingResults:[NSTextCheckingResult linkCheckingResultWithRange:range URL:url] attributes:visitedLinkAttributes];
}
else {
    [label addLinkToURL:url withRange:range];
}

TTTAttributedLabelDelegateattributedLabel:didSelectLinkWithURL:メソッドでリンクがタップされた際に呼ばれる処理を記述できるので、訪問済みかどうかの情報はそのタイミングで保存することができます。

label.delegate = self
...

#pragma mark - TTTAttributedLabelDelegate methods
- (void)attributedLabel:(TTTAttributedLabel *)label  didSelectLinkWithURL:(NSURL *)url {
    // リンクがタップされた際に呼び出される処理
    ...
    // リンクがタップされた情報を保存しておく
    [visitor visited:url];
}