独学者の独り言

Web系とかアプリ開発とか釣りとか。内容はグダグダで腰砕け。


テーマ:
TableViewCellがデフォで持っているtextLabelとdetailTextLabelは最初は複数行に対応していない。
したがって、セルの幅よりも長い文章を表示させようとするとtruncateされてしまう(「あいうえ... 」みたいな)

ラベル自体を複数行にするのは簡単で、numberOfLinesプロパティに任意の行数を入れてやれば良い。
無限行にして全ての文字列を表示させたい場合は、この値を「0」にする。

でもって、こうすることで自動的にセルの高さも変わってくれるのかなぁ、と思いきや、セルはかたくなにデフォのheightを保っており、複数行にしたラベルはものの見事にセルからはみ出してしまう。

セルの高さを変えるためには
- (CGFloat)tableView:(UITableView*)tableView heightForRowAtIndexPath:(NSIndexPath*)indexPath メソッドでセルの高さにすべき値を返してやれば良いらしいのだが、はて?、セルごとにラベルの文字数は異なってるし?、従って描画すべき高さもセルごとに異なってるし?、いったいどうやってセルごとの高さを返してやればいいんだろう?

HTMLのblock要素みたく勝手にそっちでよろしくやってくれればいいのに、と思ながらそんなメソッドなり何なりがどっかにあるんではなかろかと探しまわっても見当たらない。

どうやらラベルの文字数とフォントの大きさ、改行、折り返しなど、いろんな値から勘案して高さを計算しなければならない、らしい。

げ、まじで?

と焦ったが、その計算をやってくれるメソッドなら、あるみたいだ。


// 表示領域の横幅と文字の長さに応じて行の高さを取得
- (CGFloat)tableView:(UITableView*)tableView heightForRowAtIndexPath:(NSIndexPath*)indexPath {
UITableViewCell *cell = [self tableView:self.tableView cellForRowAtIndexPath:indexPath];
CGSize bounds = CGSizeMake(self.tableView.frame.size.width, self.tableView.frame.size.height);
//textLabelのサイズ
CGSize size = [cell.textLabel.text sizeWithFont:cell.textLabel.font
constrainedToSize:bounds
lineBreakMode:UILineBreakModeClip];
//detailTextLabelのサイズ
CGSize detailSize = [cell.detailTextLabel.text sizeWithFont: cell.detailTextLabel.font
constrainedToSize: bounds
lineBreakMode: UILineBreakModeCharacterWrap];
return size.height + detailSize.height;
}


まぁ、めんどくさいが、慣れるしかない。

ちなみに、UILineBreakModeには以下を指定できる。

UILineBreakModeWordWrap
単語の区切りで改行して全て表示

UILineBreakModeCharacterWrap
文字の途中で改行して全て表示

UILineBreakModeClip
はみ出た部分を切り捨てて1行に収める

UILineBreakModeHeadTruncation
文頭を省略して1行に収める「...うえおかきくけこ」など

UILineBreakModeTailTruncation
文中を省略して1行に収める「あいうえ...きくけこ」など

UILineBreakModeMiddleTruncation
文末を省略して1行におさめる「あいうえおかきく...」など

こんなことをしながらようやくセルの複数行表示ができた。

$独学者の独り言

・・・が、また新たな問題発生。
画像(ImageView)のAutoResizingが働いたか、複数行表示によって高さが増えたセルのImageViewがそれにつられて勝手に拡大しちょる。

autoResizingMaskを指定しても、なぜか反映されないので、現在、困っちょる。
AD
いいね!した人  |  コメント(3)

[PR]気になるキーワード