151

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

a にはデフォルトで aUITableViewCellが含まれているため、カスタム セルを作成せずにテキストを折り返すことができるはずです。UILabelカスタムセルを作成すれば機能することはわかっていますが、それは私が達成しようとしていることではありません-現在のアプローチが機能しない理由を理解したい.

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

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

その後、有効なラベルを取得しますが、その設定numberOfLines(および lineBreakMode) が機能しません。まだ 1 行のテキストが表示されます。には、テキストを表示するための十分な高さがあります。UILabel高さに大きな値を返しているだけですheightForRowAtIndexPath

4

10 に答える 10

278

これはより簡単な方法であり、私にとってはうまくいきます:

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 を追加しました。

于 2009-05-25T06:22:39.780 に答える
17

iOS7 に関する Tim Rupe の回答を更新しました。

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

- (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath
{
    NSString *cellText = @"Go get some text for your cell.";
    UIFont *cellFont = [UIFont fontWithName:@"Helvetica" size:17.0];

    NSAttributedString *attributedText =
        [[NSAttributedString alloc]
            initWithString:cellText
            attributes:@
            {
                NSFontAttributeName: cellFont
            }];
    CGRect rect = [attributedText boundingRectWithSize:CGSizeMake(tableView.bounds.size.width, CGFLOAT_MAX)
                                               options:NSStringDrawingUsesLineFragmentOrigin
                                               context:nil];
    return rect.size.height + 20;
}
于 2014-03-06T21:00:32.447 に答える
4

同じ問題が発生したときの私の経験を記録するための簡単なコメント/回答。コード例を使用したにもかかわらず、テーブル ビュー セルの高さは調整されていましたが、セル内のラベルはまだ正しく調整されていませんでした。解決策は、セルの高さが調整された後に発生するカスタム NIB ファイルからセルを読み込んでいたことでした。

そして、テキストを折り返さないようにNIBファイル内に設定し、ラベルには1行しかありませんでした。NIB ファイルの設定は、コード内で調整した設定を上書きしていました。

私が受けた教訓は、各時点でのオブジェクトの状態を常に心に留めておくことでした。オブジェクトはまだ作成されていない可能性があります。... 次の誰か。

于 2011-02-14T08:31:09.983 に答える
3

これで、テーブルビューに自己サイズのセルを含めることができます。次のようにテーブルビューを設定します

tableView.estimatedRowHeight = 85.0 //use an appropriate estimate tableView.rowHeight = UITableViewAutomaticDimension

アップルリファレンス

于 2016-10-12T02:45:11.867 に答える
3

セルにテキストのみを追加する場合はUITableView、作業に必要なデリゲートは 2 つだけです (余分な を追加する必要はありませんUILabels) 。

1)cellForRowAtIndexPath

2)heightForRowAtIndexPath

この解決策は私のために働いた: -

-(UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath*)indexPath
{ 
    static NSString *CellIdentifier = @"Cell";

    UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier];

    if (cell == nil)
    {
        cell = [[[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:CellIdentifier] autorelease];
    }

    cell.textLabel.font = [UIFont fontWithName:@"Helvetica" size:16];
    cell.textLabel.lineBreakMode = UILineBreakModeWordWrap;
    cell.textLabel.numberOfLines = 0;

    [cell setSelectionStyle:UITableViewCellSelectionStyleGray]; 
    cell.textLabel.text = [mutArr objectAtIndex:indexPath.section];
    NSLog(@"%@",cell.textLabel.text);

    cell.accessoryView = [[UIImageView alloc] initWithImage:[UIImage imageNamed:@"arrow.png" ]];

    return cell;

}

- (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath
{  
    CGSize labelSize = CGSizeMake(200.0, 20.0);

    NSString *strTemp = [mutArr objectAtIndex:indexPath.section];

    if ([strTemp length] > 0)
        labelSize = [strTemp sizeWithFont: [UIFont boldSystemFontOfSize: 14.0] constrainedToSize: CGSizeMake(labelSize.width, 1000) lineBreakMode: UILineBreakModeWordWrap];

    return (labelSize.height + 10);
}

ここで、文字列mutArrは、データを取得する可変配列です。

編集:-これが私が取った配列です。

mutArr= [[NSMutableArray alloc] init];

[mutArr addObject:@"HEMAN"];
[mutArr addObject:@"SUPERMAN"];
[mutArr addObject:@"Is SUPERMAN powerful than HEMAN"];
[mutArr addObject:@"Well, if HEMAN is weaker than SUPERMAN, both are friends and we will never get to know who is more powerful than whom because they will never have a fight among them"];
[mutArr addObject:@"Where are BATMAN and SPIDERMAN"];
于 2012-04-17T10:10:41.503 に答える
1

次のソリューションを使用します。

データはメンバーで個別に提供されます。

-(NSString *)getHeaderData:(int)theSection {
    ...
    return rowText;
}

取り扱いは簡単に行えcellForRowAtIndexPathます。セルを定義/フォントを定義し、これらの値を結果の「セル」に割り当てます。numberoflinesが「0」に設定されていることに注意してください。これは、必要なものを取得することを意味します。

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
    static NSString *CellIdentifier = @"Cell";
    UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier];

    UIFont *cellFont = [UIFont fontWithName:@"Verdana" size:12.0];
    cell.textLabel.text= [self getRowData:indexPath.section];
    cell.textLabel.font = cellFont;
    cell.textLabel.numberOfLines=0;
    return cell;
}

ではheightForRowAtIndexPath、折り返されたテキストの高さを計算します。結合サイズは、セルの幅に関連するものとします。iPad の場合、これは 1024 になります。iPhone および iPod 320 の場合。

- (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath
{
    UIFont *cellFont = [UIFont fontWithName:@"Verdana" size:12.0];
    CGSize boundingSize = CGSizeMake(1024, CGFLOAT_MAX);
    CGSize requiredSize = [[self getRowData:indexPath.section] sizeWithFont:cellFont constrainedToSize:boundingSize lineBreakMode:UILineBreakModeWordWrap];
    return requiredSize.height;    
}
于 2012-06-21T09:23:00.987 に答える
1

これは非常にシンプルで簡単であることがわかりました。

[self.tableView setRowHeight:whatEvereight.0f];

例:

[self.tableView setRowHeight:80.0f];

これは、そうするための最良の/標準的なアプローチである場合とそうでない場合がありますが、私の場合はうまくいきました。

于 2015-03-24T05:46:42.290 に答える
0

これはより良い、より短い解決策だと思います。セルのUILabel( ) を指定して高さを自動計算するようにフォーマットするだけで、すべて問題ありません。textLabelsizeToFit

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
    static NSString *CellIdentifier = @"Cell";

    UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier];
    if (cell == nil)
    {
        cell = [[[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:CellIdentifier] autorelease];
    }

    // Configure the cell...
    cell.textLabel.text = @"Whatever text you want to put here is ok";
    cell.textLabel.lineBreakMode = UILineBreakModeWordWrap;
    cell.textLabel.numberOfLines = 0;
    [cell.textLabel sizeToFit];

    return cell;
}
于 2010-06-16T14:41:20.593 に答える
-1

UITableViewCell'sこれを行うためにベースプライベートを操作できるとは思いませんUILabelUILabel自分でセルに新しいを追加し、numberOfLineswithsizeToFitを使用して適切なサイズにすることができます。何かのようなもの:

UILabel* label = [[UILabel alloc] initWithFrame:cell.frame];
label.numberOfLines = <...an appriate number of lines...>
label.text = <...your text...>
[label sizeToFit];
[cell addSubview:label];
[label release];
于 2008-09-24T20:27:14.283 に答える