如何根据文本标签长度dynamic设置表格单元高度?

我正在学习Obj-C和iOS编程,但我还是很新的。 我决定尝试做一个简单的Reddit客户端应用程序。 我试图显示在UITableView ,每个职位由自己的单元格表示的首页文章。

在单元格上,这是我如何设置标题:

 cell.textLabel.numberOfLines = 0; cell.textLabel.text = [[tempDictionary objectForKey:@"data"] objectForKey:@"title"]; [cell.textLabel sizeToFit]; 

但是,如果标题文本太长,单元格会自动裁剪。 这是一张图片:

在这里输入图像说明

如何使我的单元格自动调整高度以适应更长的标题标签,而不会与其他单元格或细节文本标签相交?

感谢您的任何帮助!

对于新的iOS 8,有一个简单的方法。

有一个新的参数可以根据您的自动布局约束来计算您的单元格高度。 这是UITableViewAutomaticDimension 。 您可以在视图控制器的viewWillAppear方法中使用它。

目标C:

 - (void)viewWillAppear:(BOOL)animated { [super viewWillAppear:animated]; self.tableView.estimatedRowHeight = 70.0; // for example. Set your average height self.tableView.rowHeight = UITableViewAutomaticDimension; [self.tableView reloadData]; } 

迅速:

 override func viewWillAppear(animated: Bool) { self.tableView.estimatedRowHeight = 70 // for example. Set your average height self.tableView.rowHeight = UITableViewAutomaticDimension self.tableView.reloadData() } 

工作很好,如你所愿在你的例子。 至于我,我在viewDidLoad添加高度的东西,并留在viewWillAppear只有reloadData()。 还有一个有用的来源 。

从文档: The default value of rowHeight is UITableViewAutomaticDimension. 现在我保留代码,但请记住,您不需要在iOS 8或更高版本中设置行高。

你需要做的主要事情是明确地设置所有约束,例如,前导,尾随,顶部和底部。 先试一下,不要在上面添加任何代码行。

你应该查看文档参考

 -[UITableViewDelegate tableView:heightForRowAtIndexPath:] 

实质上,您将需要自己测量文本,以便为每个表格行返回正确的尺寸。 如果他们是简单的NSStrings ,他们似乎是从你的屏幕截图,你可以使用NSString UIKit添加来衡量他们,例如

 -[NSString sizeWithFont:constrainedToSize:] 

约束大小可以有无限高度,但是表格单元格内容视图的宽度。

如果它们是属性string,那么在NSAttributedStringUIKit添加中有一个类似的方法,称为boundingRectWithSize:options:context:

碰巧我的应用程序TidBITS News 正是你所描述的。 我相信这是第一个找出如何做的应用程序之一; 至less在我写这篇文章的时候,我知道没有其他的应用可以做到这一点。 我在我的编程iOS 4的书中发表了我的方法,从那以后,这已经变得很平常了(尽pipe我并不是说每个人都从我这里得到它,但基本上只有一个明智的方法来处理它)。

以下是我目前版本的解释:

http://www.apeth.com/iOSBook/ch21.html#_variable_row_heights

正如你所看到的,诀窍是通过调用sizeWithFont:constrainedToSize: 提前调出所有行的高度sizeWithFont:constrainedToSize:在标签上包含每行所包含的数据,并进行必要的math运算。 这是因为tableView:heightForRowAtIndexPath:将被调用前面,一遍又一遍,以确定行的高度, 然后再询问数据。

然后,当您被要求inputcellForRowAtIndexPath: ,您可以使用预先导出的结果来将单元格放置在先前计算的高度范围内。

在Github上,我也有一个可下载的完整的项目例子,你可以阅读和运行; 它显示了如何使用约束(iOS 6和更高版本)。 在名称中查找带有variableHeightsch21示例。

在你的tableview的heightForRowAtIndexPath委托方法中:

 - (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath { if (indexPath.row == 2) { Message *aMessage = [customTableViewArray objectAtIndex:indexPath.row]; if ( [aMessage.msgBody length] <= 0 ) aMessage.msgBody = @" "; CGSize constraint = CGSizeMake(450, 40000.0f); CGSize size = [aMessage.msgBody sizeWithFont:[UIFont fontWithName:@"Helvetica" size:14] constrainedToSize:constraint lineBreakMode:UILineBreakModeCharacterWrap]; size.height = MAX(size.height,36); return 136+size.height; } else if(indexPath.row > 1) { Message *aMessage = [customTableViewArray objectAtIndex:indexPath.row]; if ( [aMessage.msgBody length] <= 0 ) aMessage.msgBody = @" "; CGSize constraint = CGSizeMake(450, 40000.0f); CGSize size = [aMessage.msgBody sizeWithFont:[UIFont fontWithName:@"Helvetica" size:14] constrainedToSize:constraint lineBreakMode:UILineBreakModeCharacterWrap]; size.height = MAX(size.height,36); return 100+size.height; } else { return 146; } } 

我道歉,我只包括部分代码。 这是整个事情。 所以基本上,如果消息是空的,它使它一个尺寸。 然后在else语句的一部分,它得到消息的大小,并根据消息大小来定义单元大小。