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

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

感觉好像应该可以在不创build自定义单元格的情况下打包文本,因为默认情况下, UITableViewCell包含UILabel 。 我知道如果我创build一个自定义单元格,我可以使它工作,但这不是我想要实现的 – 我想了解为什么我现在的方法不起作用。

我发现标签是按需创build的(因为单元格支持文本和图像访问,所以它不会创build数据视图直到需要),所以如果我做这样的事情:

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

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

这是一个更简单的方法,它适用于我:

在你的cellForRowAtIndexPath:函数中。 你第一次创build你的单元格:

 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到我返回的单元格高度,因为我喜欢我的文本周围的一个小缓冲区。

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

当我遇到同样的问题时,简短的评论/回答logging我的经历。 尽pipe使用代码示例,表格视图单元格高度正在调整,但单元格内的标签仍然没有正确调整 – 解决scheme是我正在从自定义的NIB文件中加载单元格,这是单元格高度调整发生的。

我在NIB文件里面设置了不包装文本,只有一行标签; NIB文件设置覆盖了我在代码中调整的设置。

我采取的教训是要确保始终牢记在每个时间点对象的状态 – 它们可能还没有被创build! …有人在线。

如果我们只在UITableView单元格中添加文本,我们只需要两个代表来处理(不需要添加额外的UILabels

1) cellForRowAtIndexPath

2) heightForRowAtIndexPath

这个解决scheme为我工作: –

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

这里的stringmutArr是一个可变的数组,从中获取我的数据。

编辑: –这是我拿的数组。

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

现在桌面浏览器可以有自我调整的单元格。 按如下方式设置表格视图

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

苹果参考

我使用以下解决scheme。

数据分别在会员中提供:

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

我发现这是相当简单和直率的:

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

例如:

 [self.tableView setRowHeight:80.0f]; 

这可能是也可能不是这样做的最好/标准的方法,但它对我来说很有效。

我认为这是一个更好,更短的解决scheme。 只需格式化单元格的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; } 

我不认为你可以操纵一个基础UITableViewCell's私有UILabel来做到这一点。 您可以自己添加一个新的UILabel到单元格中,并使用sizeToFit numberOfLines来适当地调整它的大小。 就像是:

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