Text Kitによるテキストレイアウト(後編)
2014年10月21日(火)

UIKit徹底解説 iOSユーザーインターフェイスの開発
iPhone/iPadアプリのUI開発テクニックを完全網羅!
この記事は、書籍『UIKit徹底解説 iOSユーザーインターフェイスの開発』の内容を、Think IT向けに特別公開しているものです。
ページング、マルチカラム表示
1つのテキストストレージに対して複数のテキストコンテナを結び付けることで、テキストを各コンテナに分割して表示することができます。
テキストコンテナの数は、テキストコンテンツの長さとテキストコンテナのサイズを元に計算され、必要な分だけ生成されたテキストコンテナが、すべてレイアウトマネージャに追加されます。本項では、複数のテキストコンテナによるページングやマルチカラム表示の方法を解説します。
例として、モデルオブジェクトとなるTextModelクラスで、テキストストレージとテキストコンテナ、そしてレイアウトマネージャの生成・管理を考えます。
まずは、テキストストレージ、レイアウトマネージャ、そしてテキストコンテナのサイズとページ数を示すプロパティを用意します。なお、コンテナサイズcontainerSizeとページ数numOfPagesはreadonlyプロパティとして、コンテナサイズを指定して初期化するinitWithContainerSize:も用意します。
[ソースコード43] プロパティ宣言
@interface TextModel : NSObject @property (nonatomic) NSTextStorage *textStorage; @property (nonatomic) NSLayoutManager *layoutManager; @property (nonatomic, readonly) CGSize containerSize; @property (nonatomic, readonly) NSUInteger numOfPages; - (id)initWithContainerSize:(CGSize)containerSize; @end
textStorageとlayoutManagerを、initWithContainerSize:で初期化します。
[ソースコード44] textStorageとlayoutManagerの初期化
- (id)initWithContainerSize:(CGSize)containerSize
{
self = [self init];
if (self) {
_containerSize = containerSize;
NSString *text = ...;
UIFont *font = ...;
// 属性付きテキストの生成(表示コンテンツ)
NSAttributedString *attrText =
[[NSAttributedString alloc] initWithString:text
attributes:@{NSFontAttributeName: font}];
// テキストストレージの生成
self.textStorage = [[NSTextStorage alloc] initWithAttributedString:attrText];
// レイアウトマネージャの生成
self.layoutManager = [[NSLayoutManager alloc] init];
// テキストストレージにレイアウトマネージャを対応付ける
[self.textStorage addLayoutManager:self.layoutManager];</p>
// テキストコンテナの生成
[self createContainers];
_numOfPages = [self.layoutManager.textContainers count];
}
return self;
}
テキストストレージとレイアウトマネージャの初期化手順はシンプルです。
テキストストレージは、表示すべきコンテンツを表現している属性付きテキストを元に生成します。レイアウトマネージャを生成したら、テキストストレージに対応付けます。
連載バックナンバー
Think ITメルマガ会員登録受付中
Think ITでは、技術情報が詰まったメールマガジン「Think IT Weekly」の配信サービスを提供しています。メルマガ会員登録を済ませれば、メルマガだけでなく、さまざまな限定特典を入手できるようになります。
