1. ホーム
  2. ios

[解決済み] カスタムセルを使用せずにUITableViewCellでテキストを折り返す方法

2022-04-30 05:07:42

質問

iPhone 0S 2.0での話です。2.1での回答も問題ありませんが、テーブルに関する違いはわかりません。

カスタムセルを作成しなくても、テキストを折り返すことは可能なように感じます。 UITableViewCell には UILabel をデフォルトで使用します。カスタムセルを作成すればうまくいくことは分かっていますが、私が目指しているのはそういうことではなく、現在のやり方がなぜうまくいかないのかを理解したいのです。

ラベルはオンデマンドで作成されることがわかったので(セルはテキストと画像のアクセスをサポートしているので、必要なときまでデータビューを作成しない)、次のようにすると。

cell.text = @""; // create the label
UILabel* label = (UILabel*)[[cell.contentView subviews] objectAtIndex:0];

を設定すると、有効なラベルが得られますが numberOfLines とlineBreakModeを使ってもうまくいかず、一行テキストになってしまいます。には十分な高さがあります。 UILabel の高さを大きな値で返しているだけです。 heightForRowAtIndexPath .

解決方法は?

もっと簡単な方法を紹介します。

の中に cellForRowAtIndexPath: 関数を使用します。最初にセルを作成するときに

UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier];
if (cell == nil)
{
    cell = [[[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:CellIdentifier] autorelease];
    cell.textLabel.lineBreakMode = UILineBreakModeWordWrap;
    cell.textLabel.numberOfLines = 0;
    cell.textLabel.font = [UIFont fontWithName:@"Helvetica" size:17.0];
}

ラベルの行数を0行にして、必要な行数だけ使えるようにしたことに気づくだろう。

次に UITableViewCell になるので、それを heightForRowAtIndexPath 関数を使用します。

- (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath
{
    NSString *cellText = @"Go get some text for your cell.";
    UIFont *cellFont = [UIFont fontWithName:@"Helvetica" size:17.0];
    CGSize constraintSize = CGSizeMake(280.0f, MAXFLOAT);
    CGSize labelSize = [cellText sizeWithFont:cellFont constrainedToSize:constraintSize lineBreakMode:UILineBreakModeWordWrap];

    return labelSize.height + 20;
}

テキストの周りに少しバッファを持たせたいので、返されたセルの高さに20を追加しました。