ここでは、その方法を説明します。コンテンツとして標準の UITableViewCells (スタイル - UITableViewCellStyleSubtitle) を使用して、UITableView (グループ化されたスタイル、1 つのセクション) を実装しています。私の textLabel.text は非常に長くなる可能性があるため、TableView:cellForRowAtIndexPath でいくつかのパラメーターを設定します。
cell.textLabel.lineBreakMode = UILineBreakModeWordWrap;
cell.textLabel.numberOfLines = 0;
cell.textLabel.font = [UIFont boldSystemFontOfSize:CELL_FONT_SIZE];
cell.detailTextLabel.lineBreakMode = UILineBreakModeWordWrap;
cell.detailTextLabel.numberOfLines = 0;
[self configureCell:cell atIndexPath:indexPath];
セルの高さを変更するために、次のように tableView:heightForRowAtIndexPath: を実装しました。
Test *test = (Test *)[self.frc objectAtIndexPath:indexPath];
NSString *cellText = test.test_name;
UIFont *cellFont = [UIFont boldSystemFontOfSize:CELL_FONT_SIZE];
CGFloat horizontalConstraint;
if (self.bagdePresent)
{
// there will be big badge!
horizontalConstraint = 250.0f;
} else
{
// there will NO badge
horizontalConstraint = 280.0f;
}
CGSize constraintSize = CGSizeMake(horizontalConstraint, MAXFLOAT);
CGSize labelSize = [cellText sizeWithFont:cellFont constrainedToSize:constraintSize lineBreakMode:UILineBreakModeWordWrap];
// return label height, 20 as gap, 30 for rating image,
return labelSize.height + 20 + 30;
最初に、セルにバッジ画像があるかどうかを確認します。ある場合は、利用可能な水平方向のスペースを減らします。
そして、ここに問題があります (最終的に): 一部の文字列 (一部の文字列の長さ) の場合、 sizeWithFont:constrainedToSize:lineBreakMode: は、テキスト プロパティを同じ文字列に設定すると、実際のセルの textLabel の高さよりも小さい値を返します。その結果、セルの textLabels がセルの境界よりも大きい場合があります。間違って表示された文字列にいくつかの単語を追加\削除すると、sizeWithFont:constrainedToSize:lineBreakMode: は正確な高さを示し、後で textLabel の実際の高さを確認します。
フォントの問題かと思いましたが、ご覧の通りフォントは同じです。ここからどこを掘る?;)
UPD1: 以下は、heightForRowAtIndexPath で計算された値よりも高い textLabel の例です。