如何在没有自定义单元格的情况下将文本包装在 UITableViewCell 中

Posted

技术标签:

【中文标题】如何在没有自定义单元格的情况下将文本包装在 UITableViewCell 中【英文标题】:How do I wrap text in a UITableViewCell without a custom cell 【发布时间】:2008-09-24 20:00:03 【问题描述】:

这是在 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 中的高度返回一个较大的值。

【问题讨论】:

【参考方案1】:

这是一个更简单的方法,它对我有用:

在您的 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,因为我喜欢文本周围的小缓冲区。

【讨论】:

您不需要将 cell.textLabel.numberOfLines 设置为任意高的数字。将其设置为 0 意味着“显示所需的行数。” 谢谢,今晚有机会在我自己的项目中验证后,我会编辑我的帖子。 将行数设置为 0 可以正常工作(显示所需的行数) cagreen:原来我可以复制这个,但只有如果我在模拟器中使用 iPhone OS 3.0。当我使用 3.1+ 时,detailTextLabel 的大小调整匹配 sizeWithFont 就好了。因此,Tim 的方法非常有效 - 仅适用于 3.1+(可能是由于 3.0 默认单元格渲染中的错误/错误功能)。作为记录,我使用 12(每个)的垂直顶部/底部边距、(188.0,CGFLOAT_MAX)的详细文本标签大小和 15 的粗体系统字体大小。 UILineBreakModeWordWrap 在 ios 6 中已弃用。请改用 NSLineBreakByWordWrapping。【参考方案2】:

更新了 Tim Rupe 对 iOS7 的回答:

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 有人下线。

【讨论】:

【参考方案4】:

如果我们只在UITableView 单元格中添加文本,我们只需要两个代理即可工作(无需添加额外的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"];

【讨论】:

【参考方案5】:

现在表格视图可以具有自定大小的单元格。如下设置表格视图

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

Apple Reference

【讨论】:

【参考方案6】:

我使用以下解决方案。

数据在成员中单独提供:

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

【讨论】:

【参考方案7】:

我发现这非常简单直接:

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

例如:

[self.tableView setRowHeight:80.0f];

这可能是也可能不是最好/标准的方法,但它在我的情况下有效。

【讨论】:

据我了解,rowHeight 属性设置了一个固定高度,将用于表格视图中的所有单元格。使用 rowHeight 对大型表格的性能更好,但如果您需要每个单元格的高度根据其内容而变化,那么似乎必须使用 tableView:heightForRowAtIndexPath: 方法。【参考方案8】:

在 swift 中尝试我的代码。此代码也适用于普通的 UILabel。

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 

【讨论】:

【参考方案9】:

我认为这是一个更好、更短的解决方案。只需格式化单元格的UILabel (textLabel) 以通过指定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;

【讨论】:

【参考方案10】:

我不认为你可以操纵一个基础 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];

【讨论】:

以上是关于如何在没有自定义单元格的情况下将文本包装在 UITableViewCell 中的主要内容,如果未能解决你的问题,请参考以下文章

在没有自定义单元格的情况下向 uitableview 显示详细信息披露按钮

如何在不丢失表格视图单元格的情况下将现有集合视图添加到表格视图

如何在不引用其他单元格的情况下将报表从 Reporting Services 2005 导出到 Excel?

如何从自定义 UITableview 中检索有关选择单元格的数据

在没有 CoreText 的情况下将 UITextView 中的文本包装在 UIImage 周围

如何在不破坏响应性的情况下将 <div> 锚定到表格单元格的左下角?