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

问题是在 iPhone 0S 2.0。2.1 的答案也接受,尽管我不知道这两个系统中 tables 有什么不同。

似乎可以在不创建自定义单元格的情况下将文本换行,因为 UITableViewCell默认包含 UILabel。我知道如果我创建一个自定义单元格,我可以让它工作,但这不是我想要实现的——我想知道为什么我当前的方法不能工作。

我已经知道标签是根据需要创建的(因为单元格支持文本和图像访问,所以在必要时它不会创建数据视图) ,所以如果我这样做:

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

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

99535 次浏览

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

这里有一个更简单的方法,对我很有效:

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

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

一个简短的评论/答案,以记录我的经验,当我有同样的问题。尽管使用了代码示例,表格视图单元格的高度正在调整,但是单元格内部的标签仍然没有正确调整——解决方案是我从一个定制的 NIB 文件加载我的单元格,这发生在调整后的单元格高度 之后

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

我得到的教训是要确保始终牢记对象在每个时间点的状态是什么——它们可能还没有被创建!一定会有人这么做的。

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

我使用以下解决方案。

数据由一名成员单独提供:

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

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

我发现这很简单明了:

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

例如:

[self.tableView setRowHeight:80.0f];

这可能是最好的/标准的方法,也可能不是,但它在我的案例中起作用了。

现在表格视图可以有自调大小的单元格

EstiatedRowHeight = 85.0//使用适当的估计值 RowHeight = UITableViewAutomatic維度

苹果参考文献

请快速尝试我的代码。这个代码也可以用于普通的 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