データや画像の検出と埋め込み[2ページ目]

[ソースコード33] 属性付きテキストを使用してリンクを埋め込む

NSURL *url = [NSURL URLWithString:@"http://www.apple.com/"];
NSAttributedString *linkText =
[[NSAttributedString alloc] initWithString:@"link to apple website"
                                attributes:@{NSLinkAttributeName: url}];

上記コードの通り、NSLinkAttributeNameを用いて、リンクを埋め込みたいテキストに対して特定のURLを関連付けることができます。
また、属性を使用して埋め込むリンクは、UITextViewがデフォルトで検出可能なデータタイプに限定する必要はありません。例えば、「メッセージ」アプリは、スキーム「sms」で開くことができるため、メッセージ送信のリンクを埋め込むことも可能です(ソースコード34)。
下記コードで、「Send SMS message」がリンクとして検出され、タップすると「メッセージ」アプリが起動します。

[ソースコード34] メッセージ送信のためのリンクを埋め込む

NSURL *smsUrl = [NSURL URLWithString:@"sms:090-1234-5678"];
NSAttributedString *sendSmsText =
[[NSAttributedString alloc] initWithString:@"Send SMS message"
                                attributes:@{NSLinkAttributeName: smsUrl}];

なお、NSLinkAttributeName属性を指定して埋め込んだリンクも、UITextViewのlinkTextAttributesに設定されているアピアランスが適用されます。また、UITextViewのデリゲートが設定されていれば、タップ時にtextView:shouldInteractWithURL:inRange:メソッドが呼ばれます。

続いて、属性付きテキストを用いてテキスト内に画像を埋め込む方法を解説します。
NSAttachmentAttributeName属性を用います。値はNSTextAttachmentオブジェクトで指定します。例えば、テキストの先頭に画像を埋め込むには、属性付きテキストを生成します(ソースコード35)。属性付きテキストの生成には、NSAttributedStringのattributedStringWithAttachment:クラスメソッドが利用できます。

[ソースコード35] 属性付きテキストによる画像の埋め込み

// 画像を元にNSTextAttachmentを生成
NSTextAttachment *textAttachment = [[NSTextAttachment alloc] init];
textAttachment.image = [UIImage imageNamed:@"apple"];

// 画像の位置とサイズを調整
textAttachment.bounds = CGRectMake(0, -2, image.size.width, image.size.height);

// 画像を表示する属性付きテキストを生成 
NSAttributedString *attachementText =
[NSAttributedString attributedStringWithAttachment:textAttachment];

// 属性付きテキスト内に画像を埋め込み
NSMutableAttributedString *imageText =
[[NSMutableAttributedString alloc] initWithString:@"Apple  リンゴ"];
[imageText insertAttributedString:attachementText atIndex:6];

上記コードで画像を埋め込んだ表示結果を示します(図15)。

図15: 属性付きテキストによる画像の埋め込み

画像の表示位置は、テキストのベースラインが画像の左下になるように調整されます。表示位置やサイズを変更したい場合には、NSTextAttachmentのboundsプロパティを利用します。

属性付きテキストを利用して埋め込んだ画像は、タップが検出されると画像のコピーもしくはカメラロールへの保存が促されます(デフォルト処理)。この処理のカスタマイズは、リンクやデータ検出時と同様に、UITextViewDelegateのメソッドを利用します(ソースコード36)。

[ソースコード36] 画像タップ時の処理をカスタマイズ

- (BOOL)textView:(UITextView *)textView shouldInteractWithTextAttachment:
           (NSTextAttachment *)textAttachment inRange:(NSRange)characterRange
{
    // 画像タップ時の処理
    return YES; // YES:デフォルトの処理をする、NO:デフォルトの処理をしない
}

なお、属性付きテキストによる画像の埋め込みは、UITextView以外のオブジェクト(UILabelなど)でも使用可能です。ただし、画像タップの検出はUITextView上の表示のみです。

この記事のもとになった書籍
UIKit徹底解説 iOSユーザーインターフェイスの開発

西方 夏子 著/丸山 弘詩 編
価格:3,800円+税
発売日:2014年06月13日発売
ISBN:978-4-8443-3608-2
発行:インプレスジャパン

UIKit徹底解説 iOSユーザーインターフェイスの開発

ユーザーインターフェイス(UI)を制御するUIKitは、iOSアプリの中心的役割を担います。UIKitを深く理解することが、アプリ開発での多くの問題解決に繋がります。本書では、アプリの起動から画面表示、画面レイアウト、イベントハンドリングと、常に稼働しているUIKitの機能を丁寧に解説します。メインとなるコンテンツの表示からステータスバーを含むバーの制御、フォントやテキストの改良など、ビューやテキストの「外観」(アピアランス)を改善する内容も充実させています。使用頻度の高いテーブルビューとコレクションビュー、そしてユニバーサルアプリ化に有益なカスタムコンテナビューコントローラに関しては、チュートリアル形式で解説します。また、StoryboardやAuto Layoutも今後のアプリ開発でさらに重要となる状況を見越して、詳細解説に留まらず同じくチュートリアルで多くの具体例を紹介します。

Amazon詳細ページへImpress詳細ページへ

人気記事トップ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