我如何在没有自定义单元格的UITableViewCell中包装文本


151

这是在iPhone 0S 2.0上。2.1的答案也很好,尽管我不知道有关表的任何差异。

感觉应该可以在不创建自定义单元格的情况下自动换行,因为默认情况下a UITableViewCell包含一个UILabel。我知道如果创建自定义单元,我就可以使其正常工作,但这不是我要实现的目标-我想了解为什么我当前的方法不起作用。

我发现标签是按需创建的(由于单元格支持文本和图像访问,因此它直到需要时才创建数据视图),因此,如果执行以下操作:

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

然后我得到一个有效的标签,但是numberOfLines在该标签(和lineBreakMode)上的设置不起作用-我仍然得到单行文本。UILabel要显示的文本中有很多高度-我只是返回的高度值heightForRowAtIndexPath

Answers:


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 2009年

谢谢,我今晚有机会在自己的项目中进行验证后,将编辑我的帖子。
蒂姆·鲁普

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
iOS 6中不推荐使用UILineBreakModeWordWrap。请改用NSLineBreakByWordWrapping。
伊桑·艾伦

16

更新了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文件设置覆盖了我在代码中调整的设置。

我上的课是确保始终记住对象在每个时间点的状态-可能尚未创建它们!...某人下线。


2

如果我们仅在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"];

2

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

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

苹果参考


0

我使用以下解决方案。

数据在成员中单独提供:

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

可以轻松地在中进行处理cellForRowAtIndexPath。定义单元格/定义字体,并将这些值分配给结果“ cell”。请注意,将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

快速尝试我的代码。此代码也适用于普通的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 

-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];
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.