データや画像の検出と埋め込み

UIKit徹底解説 iOSユーザーインターフェイスの開発iPhone/iPadアプリのUI開発テクニックを完全網羅!この記事は、書籍『UIKit徹底解説 iOSユーザーインターフェイスの開発』の内容を、Think IT向けに特別公開しているものです。UITextViewは、リンクなどのデータを検出す

西方 夏子(にしかた・なつこ)

2014年10月6日 20:00

UIKit徹底解説 iOSユーザーインターフェイスの開発
iPhone/iPadアプリのUI開発テクニックを完全網羅!Amazon詳細ページへ

この記事は、書籍『UIKit徹底解説 iOSユーザーインターフェイスの開発』の内容を、Think IT向けに特別公開しているものです。

UITextViewは、リンクなどのデータを検出する機能を持っています。検出可能なデータの種類は以下の通りです。

  • UIDataDetectorTypePhoneNumber(電話番号)
  • UIDataDetectorTypeLink(リンク)
  • UIDataDetectorTypeAddress(住所)
  • UIDataDetectorTypeCalendarEvent(カレンダーイベント)

検出対象とするデータタイプはIBで設定するか、UITextViewのdataDetectorTypesプロパティで指定します。なお、データ検出は、編集不可(editableプロパティの値がNO)のUITextViewに対してのみ有効です。
全タイプを検出可能にすると、検出されたデータがリンクとして表示されます(図13)。

図13: データ検出の結果

データ検出されたテキストのアピアランスを調整する方法として、UITextViewにlinkTextAttributesプロパティが用意されています(iOS 7以降)。linkTextAttributesには、前項で解説したNSAttributedStringで使用される属性を設定します。
例えば、二重下線付きのオレンジ色テキストとするには、下記のlinkTextAttributesプロパティを設定します*4。

*4 iOS 7.1時点では、linkTextAttributesに設定したいくつかの属性(NSFontAttributeNameなど)が機能しない問題があります。

[ソースコード31] 検出データテキストのアピアランスを変更

self.textView.linkTextAttributes =
    @{NSUnderlineStyleAttributeName: @(NSUnderlineStyleDouble),
      NSForegroundColorAttributeName: [UIColor orangeColor]};

その表示結果が下図です(図14)。

図14: データ検出の結果(linkTextAttributesによるアピアランス変更)

検出データをタップすると、各データの種別に応じた処理が促されます。例えば、URLリンクであれば「Safari」を開く、電話番号であれば電話を掛けるなどの処理です。
なお、このデフォルトの処理は、UITextViewDelegateのメソッドを利用してカスタマイズが可能です(iOS 7以降)。例えば、リンク先を「Safari」ではなくアプリ内で開くには、デリゲートメソッドを実装します(ソースコード32)。

[ソースコード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オブジェクトで指定します。

人気記事トップ10

人気記事ランキングをもっと見る

企画広告も役立つ情報バッチリ! Sponsored

ClickHouse Cloudが実現した広告運用SaaS「ATOM」のデータ基盤革新、パフォーマンスを向上しながら、運用負荷とコストを削減 11月11日 6:20 AIで開発が加速する時代、品質保証はどう変わる? Tricentisが示すAIエージェント活用の実像 11月9日 6:45 悪用までの猶予が「1分」に迫るフロンティアAI時代に開発と本番を貫く脆弱性管理が必要 10月29日 8:30 欧州CRA対応とSBOM運用。AI生成コードのOSS混入問題の対策とは ――スニペット単位で検出する「FossID」「Insignary Clarity」によるSBOM運用 9月16日 6:40 PostgreSQLからTiDBへ、稼働中SaaSで進める段階的DB移行の実践と再設計への展望 9月7日 6:30 機能安全開発におけるGoogleTestの活用を支援!「Parasoft C/C++test CT」で実現する効率化&AI連携 4月14日 6:30 【CNDW2025】Grafanaが明かす「オブザーバビリティの哲学」ー最小限の労力で実用的なインサイトを得るには 1月23日 6:30 【CNDW2025】プロダクト急増に備える基盤刷新 ーウェルスナビがECSからEKSへの移行で得た知見とは 1月15日 6:30 【CNDW2025】250環境を5人で運用、構築時間は30分に ーKINTOテクノロジーズが語るインフラ基盤組織の作り方 2025年12月18日 6:30 新たな自動化で熱視線! AIエージェントの「推論能力」を支える2つのコンポーネントとは? 2025年11月28日 6:30