nimbusのNIAttributedLabelを使うといわゆるリッチテキスト的なことができます。今回はNIAttributedLabelで文字列の一部をリンクにする方法について説明します。

NIAttributedLabelの生成

NIAttributedLabelを使うためにNimbusAttributedLabel.hをimportする必要があります。

#import "NimbusAttributedLabel.h"

プログラムによる生成。UILabelと同じです。ちなみにNIAttributedLabelはUILabelのSubclassです。

NIAttributedLabel *label = [[NIAttributedLabel alloc] initWithFrame:frame];

以下の手順でInterface Builderで配置することも可能です。

  • Labelを配置
  • Custom ClassをNIAttributedLabelに変更する

01

リンクをつける

指定した範囲のテキストにリンクをつけることができます。

_label.text = @"Link to Apple website.";
NSRange linkRange = NSMakeRange(8, 13);
[_label addLink:[NSURL URLWithString:@"http://www.apple.com/"] range:linkRange];

このようになります。

02

リンクカラー、押している間の背景カラーを変更したり、アンダーラインをつけることもできます。

// リンクカラー
_label.linkColor = [UIColor colorWithRed:30/255.0 green:144/255.0 blue:255/255.0 alpha:1.0];
// 押している間の背景カラー
_label.highlightedLinkBackgroundColor = [UIColor colorWithRed:0/255.0 green:255/255.0 blue:255/255.0 alpha:1.0];
// アンダーラインをつける
_label.linksHaveUnderlines = YES;

このようになります。
03
押しているとき。
04

URLを自動認識して自動でリンクにする機能もあります。

_label.autoDetectLinks = YES;

05

電話番号を自動リンクするようにもできます。

_label.autoDetectLinks = YES;
_label.dataDetectorTypes = NSTextCheckingTypeLink|NSTextCheckingTypePhoneNumber;

06

リンクをSafariやメールアプリで開く

リンクを押したらSafariを開くようにするには、NIAttributedLabelDelegateを実装するようにします。

@interface STAttributedLabelSampleViewController : UIViewController

リンクを押した時に以下のDelegateメソッドが呼ばれるので実装します。

- (void)attributedLabel:(NIAttributedLabel *)attributedLabel didSelectTextCheckingResult:(NSTextCheckingResult *)result atPoint:(CGPoint)point
{
    if (result.resultType == NSTextCheckingTypeLink) {
        [[UIApplication sharedApplication] openURL:result.URL];
    }
}

NSTextCheckingResult#resultTypeでリンクかどうかを判定し、そうであればNSTextCheckingResult#URLにリンクのURLが入っています。これをUIApplication#openURLに渡せばSafariで開くことができます。

もちろんUIWebViewを使ってアプリ内でURLを開いても構いません。後述しますがリンクを長押するとActionSheetでSafariで開くかどうかをユーザーが選択することもできます。

ちなみにautoDetectLinksでE-mailが自動リンクされたものである場合は、NSTextCheckingResult#URLにmailto:test@example.comのようになっています。これをUIApplication#openURLに渡せばメールアプリが開きます。

電話番号が自動リンクされたものである場合、NSTextCheckingResult#URL、NSTextCheckingResult#phoneNumberはnilです・・・。以下のようにして”tel:”で始まるURLを生成して、openURLへ渡せば電話アプリが開きます。

NSString *phoneNumber = [attributedLabel.text substringWithRange:result.range];
NSURL *url = [NSURL URLWithString:[@"tel:" stringByAppendingString:phoneNumber]];

リンクを長押ししたときの対応

デフォルトではリンクを長押しすると以下の様なActionSheetが表示されます。

07

これによりSafariで開くことができたり、URLをコピーできたり便利なのですが、場合によっては表示したくない時もあるでしょう。その場合は、以下のDelegateメソッドでNOを返すようにします。

- (BOOL)attributedLabel:(NIAttributedLabel *)attributedLabel shouldPresentActionSheet:(UIActionSheet *)actionSheet withTextCheckingResult:(NSTextCheckingResult *)result atPoint:(CGPoint)point
{
    return NO;
}