データや画像の検出と埋め込み
UIKit徹底解説 iOSユーザーインターフェイスの開発
iPhone/iPadアプリのUI開発テクニックを完全網羅!この記事は、書籍『UIKit徹底解説 iOSユーザーインターフェイスの開発』の内容を、Think IT向けに特別公開しているものです。
UITextViewは、リンクなどのデータを検出する機能を持っています。検出可能なデータの種類は以下の通りです。
- UIDataDetectorTypePhoneNumber(電話番号)
- UIDataDetectorTypeLink(リンク)
- UIDataDetectorTypeAddress(住所)
- UIDataDetectorTypeCalendarEvent(カレンダーイベント)
検出対象とするデータタイプはIBで設定するか、UITextViewのdataDetectorTypesプロパティで指定します。なお、データ検出は、編集不可(editableプロパティの値がNO)のUITextViewに対してのみ有効です。
全タイプを検出可能にすると、検出されたデータがリンクとして表示されます(図13)。
データ検出されたテキストのアピアランスを調整する方法として、UITextViewにlinkTextAttributesプロパティが用意されています(iOS 7以降)。linkTextAttributesには、前項で解説したNSAttributedStringで使用される属性を設定します。
例えば、二重下線付きのオレンジ色テキストとするには、下記のlinkTextAttributesプロパティを設定します*4。
*4 iOS 7.1時点では、linkTextAttributesに設定したいくつかの属性(NSFontAttributeNameなど)が機能しない問題があります。
self.textView.linkTextAttributes = @{NSUnderlineStyleAttributeName: @(NSUnderlineStyleDouble), NSForegroundColorAttributeName: [UIColor orangeColor]};
その表示結果が下図です(図14)。
検出データをタップすると、各データの種別に応じた処理が促されます。例えば、URLリンクであれば「Safari」を開く、電話番号であれば電話を掛けるなどの処理です。
なお、このデフォルトの処理は、UITextViewDelegateのメソッドを利用してカスタマイズが可能です(iOS 7以降)。例えば、リンク先を「Safari」ではなくアプリ内で開くには、デリゲートメソッドを実装します(ソースコード32)。
- (BOOL)textView:(UITextView *)textView shouldInteractWithURL:(NSURL *)URL inRange:(NSRange)characterRange { if ([[URL scheme] rangeOfString:@"http"].location != NSNotFound) { // UIWebViewを利用してアプリ内でリンクを開く return NO; } return YES; }
検出データの種別により、上記メソッドに渡される引数URLのスキームが異なります。電話番号は「tel」スキーム、住所とカレンダーイベントは「x-apple-data-detectors://embeded-result」スキームが利用されます。それ以外は、検出したスキームがそのまま用いられます。
上記の例では、UITextViewの機能を使用してリンクの検出を行っていますが、属性付きテキストを用いてテキストにリンクを埋め込むことも可能です(iOS 7以降)。
リンクの埋め込みに使用する属性は、NSLinkAttributeNameです。値はNSURLオブジェクト(推奨)またはNSStringオブジェクトで指定します。