UITableViewCellのカスタムセルでUILabelの複数行表示をうまいことする

メモエントリ。

複数行表示したいUILabelを置いたカスタムセルを作って、UILabelの高さ調整とセルの高さ調整をうまいことまとめる方法。

// MyTableViewController.m
- (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath {
	NSString *text = @"cell text"; // indexPathから該当セル用のデータをよしなに。
	
	CGFloat cellHeight = 83; // カスタムセルのデフォルトのheight
	CGFloat textHeight = 22; // カスタムセル内の複数行表示したいラベルのデフォルトのheight
	
	UIFont *font = [UIFont fontWithName:@"Helvetica-Bold" size:18]; // IBで設定したのと同じに。
	CGSize size = CGSizeMake(292, 4000); // カスタムセル内のラベルのwidth。heightは適当に。
	CGSize textSize = [text sizeWithFont:font constrainedToSize:size lineBreakMode:UILineBreakModeCharacterWrap]; // IBで設定したのと同じlineBreakModeにする。
	
	cellHeight += (textSize.height - textHeight);
	
	return cellHeight;
}
// MyCustomCell.m
- (void)layoutSubviews {
	[super layoutSubviews];

	〜〜レイアウトコード

	// ラベルはnumberOfLines = 0, lineBreakModeにはCharacterWrapかWordWrap
	CGRect frame = [label frame];
	frame.size = CGSizeMake(292, 0); // ラベルのwidthを都度指定。セルは再利用されるので、テキストが短い状態でフィットされるとその後が困ったことになるため。
	[label setFrame:frame];
	[label sizeToFit];

	〜〜レイアウトコード
}

あとはIBでAutosizingを調整。
対象のラベルより下にUIパーツがある場合は、それらのボトムマージンを固定にし、ラベルのボトムマージンは固定しない。

カスタムセルはこのあたりを。
http://d.hatena.ne.jp/KishikawaKatsumi/20081024/1224857278