読者です 読者をやめる 読者になる 読者になる

UITableViewCell の高さを文字列の長さに応じて動的に変更する

objective-c ios

環境:iOS SDK 7.1

UITableView の セル毎に呼ばれる Delegate メソッドtableView:heightForRowAtIndexPath:の戻り値でセルの高さが決まる。
この時にそのセルに入れる文字列から高さを動的に変更する必要がある。
で、どうやるかというと NSString のboundingRectWithSize:options:attributes:context:メソッド、または NSAttributedString のboundingRectWithSize:options:context:メソッドを呼んで返ってくる CGRect の高さを使えばよい。
これらのメソッドでは自身が持つ文字列と引数に渡す矩形サイズ、フォント情報などから文字列が収まる適切な高さが設定された矩形を返してくれる。

- (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath
{
    // セル内のラベルに表示させる文字列
    NSString *labelText = self.textArray[indexPath.row];

    // 最小でも高さ 80px は確保する
    return MAX([self calcHeight:labelText], 80);
}

// 文字列が収まる適切な高さを返す
- (CGFloat)calcHeight:(NSString *)text {

    // 表示最大幅・高さ
    CGSize maxSize = CGSizeMake(260, CGFLOAT_MAX);

    // 文字列のフォント種類、サイズなど属性を指定
    NSDictionary *attrDic = @{NSFontAttributeName:[UIFont systemFontOfSize:11.0]};

    CGRect rect = [text boundingRectWithSize:maxSize
                                     options:NSStringDrawingUsesLineFragmentOrigin
                                  attributes:attrDicattrDic
                                     context:nil];
    return rect.size.height;
}

iOS8 からは自動でやってくれるようになったみたい。

iOS - ついにTableViewCellの高さが自動で調整してくれるようになった件!!! - Qiita
http://qiita.com/fmtonakai/items/c6b5c79ba32c1e33a34a