非表示領域の設定と表示形状の変更

非表示領域の設定と表示形状の変更

テキストコンテナには、非表示領域を指定できます。非表示領域はUIBezierPathを利用して設定するため、任意の形状を非表示にすることが可能です。また、1つのテキストコンテナ内に複数の非表示領域を設定することもできます。
非表示領域の設定は、exclusionPathsプロパティを使用します。exclusionPathsはNSArrayオブジェクトで、UIBezierPathオブジェクトを格納します。なお、exclusionPathsに設定する非表示領域は、NSTextContainerの座標系を元にします。

[ソースコード41] 非表示領域の設定とテキストの回り込み

UIImageView *imageView = 
[[UIImageView alloc] initWithImage:[UIImage imageNamed:@"image"]];
// 画像の表示位置
CGRect imageRect = CGRectMake(100, 100, 
                              imageView.image.size.width, 
                              imageView.image.size.height);
imageView.frame = imageRect;
[self.textView addSubview:imageView];

// 非表示領域の計算(画像の表示位置をテキストコンテナの座標に変換)
CGRect exclusionRect = CGRectOffset(imageView.frame, 
                                    -self.textView.textContainerInset.left, 
                                    -self.textView.textContainerInset.top);
// 非表示領域の設定
UIBezierPath *path = [UIBezierPath bezierPathWithRect:exclusionRect];
self.textView.textContainer.exclusionPaths = @[path];

上記の通り、非表示領域を設定してその位置に画像を表示すれば、テキストの回り込みが実現できます。exclusionRectとimageRectは異なることに注意してください。exclusionRectはNSTextContainerの座標系、imageRectはUITextViewの座標系で示されます。

NSTextContainerによる表示領域は、デフォルトでsizeプロパティにより示されるサイズを持った矩形領域となっています。これに対して、より複雑な領域を表示領域として設定するには、NSTextContainerをサブクラス化して以下のメソッドをオーバーライドします。

[ソースコード42] ライン矩形を示すメソッド

- (CGRect)lineFragmentRectForProposedRect:(CGRect)proposedRect 
                                  atIndex:(NSUInteger)characterIndex 
                         writingDirection:(NSWritingDirection)baseWritingDirection 
                            remainingRect:(CGRect *)remainingRect;

テキストコンテナが示す表示領域の概要を示します(図17)。
lineFragmentRectForProposedRect...メソッドに渡されるproposedRectは、レイアウトマネージャーが計算した行の表示領域で、実際にテキストを表示すべき領域を返します。また、exclusionPathsによる非表示領域があると、非表示領域で分割された領域がremainingRectとして渡されます。そのため、テキストの分割位置もこのメソッドで調整します。
なお、指定したlineFragmentRectに対して、実際にテキストが表示される領域は、lineFragmentPaddingを除いた内側になります。lineFragmentPaddingはNSTextContainerのプロパティで、デフォルト値として0.5が設定されています。

図17: 表示領域の詳細設定に関するパラメータ

この記事のもとになった書籍
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