カスタムセルなしでUITableViewCellでテキストを折り返す方法


151

これは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

回答:


277

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

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


17
cell.textLabel.numberOfLinesを任意の高い数値に設定する必要はありません。0に設定することは、「表示に必要なだけの行数」を意味します。
mmc

おかげで、私は自分のプロジェクトでそれを確認する機会を得た後、今夜私の投稿を編集します。
Tim Rupe

1
行数を0に設定すると正常に動作します(表示に必要なだけの行数)
prakash

1
cagreen:これを再現できることが判明しました。ただし、シミュレータでiPhone OS 3.0を使用している場合のみです。3.1+を使用すると、detailTextLabelのサイズ変更がsizeWithFontのサイズ変更とうまく一致します。したがって、Timの方法は非常に適切に機能します。3.1以上の場合のみです(3.0のデフォルトセルレンダリングのバグ/機能不良が原因と考えられます)。記録のために、私は12(それぞれ)の垂直上/下の余白を使用しています、(188.0、CGFLOAT_MAX)の詳細テキストラベルのサイズ、およびboldSystemFontOfSize 15
ジョーD'アンドレア

17
UILineBreakModeWordWrapはiOS 6で廃止されました。代わりにNSLineBreakByWordWrappingを使用してください。
イーサンアレン

16

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;
}

3

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

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

私が受けた教訓は、常に各時点でのオブジェクトの状態を常に念頭に置いておくようにすることでした-それらはまだ作成されていない可能性があります!... hth誰かがやってくる。


2

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"];

2

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

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

アップルリファレンス


0

以下のソリューションを使用しています。

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

-(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;    
}

0

私はこれが非常にシンプルでストレートであることがわかりました:

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

例:

[self.tableView setRowHeight:80.0f];

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


私が理解しているように、rowHeightプロパティは、テーブルビューのすべてのセルに使用される固定の高さを設定します。大きなテーブルでのパフォーマンスにはrowHeightの方が優れていますが、各セルの高さをその内容に基づいて変化させる必要がある場合は、tableView:heightForRowAtIndexPath:メソッドを使用する必要があるようです。
jk7

0

迅速に私のコードを試してください。このコードは、通常のUILabelsでも機能します。

extension UILabel {
    func lblFunction() {
        //You can pass here all UILabel properties like Font, colour etc....
        numberOfLines = 0
        lineBreakMode = .byWordWrapping//If you want word wraping
        lineBreakMode = .byCharWrapping//If you want character wraping
    }
}

今すぐこのように呼び出します

cell.textLabel.lblFunction()//Replace your label name 

-1

これはより良い、より短い解決策だと思います。ただ、フォーマットUILabeltextLabel指定することによって)高さの自動計算するには、セルのをsizeToFit、すべてが問題ないはずです。

- (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;
}

-2

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

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];
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.