2

ここでは、その方法を説明します。コンテンツとして標準の 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 の例です。 背の高いテキスト ラベル

テキストが長い通常の textLabel

4

1 に答える 1

2

を活用することをお勧めしますsizeToFit。最初にラベルの幅を に設定しhorizontalConstraint、次に呼び出します[cell.textLabel sizeToFit](ラベルの高さをコンテンツに合わせて調整しますが、幅は設定したままにします (ほぼ - つまり、少し狭くなる可能性があります)。

- (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath
{
    CGFloat horizontalConstraint;
    if (self.bagdePresent)
    {
        // there will be big badge!
        horizontalConstraint = 250.0f;
    } else
    {
        // there will NO badge
        horizontalConstraint = 280.0f;
    }

    Test *test = (Test *)[self.frc objectAtIndexPath:indexPath];
    NSString *cellText = test.test_name;

    UILabel *label = [[UILabel alloc] initWithFrame:CGRectZero];
    label.text = test.test_name;
    UIFont *cellFont = [UIFont boldSystemFontOfSize:CELL_FONT_SIZE];           
    label.lineBreakMode = UILineBreakModeWordWrap;
    label.numberOfLines = 0;
    label.font = cellFont;

    CGRect frame = label.frame;
    frame.size.width = horizontalConstraint;
    label.frame = frame;
    [label sizeToFit];

    CGSize labelSize = label.frame.size;

    // return label height, 20 as gap, 30 for rating image,
    return labelSize.height + 20 + 30;
}
于 2012-11-04T11:12:48.473 に答える