以编程方式动态调整多行 UILabel 和随附的表格视图单元格

Posted

技术标签:

【中文标题】以编程方式动态调整多行 UILabel 和随附的表格视图单元格【英文标题】:dynamically size multi-line UILabel and accompanying table view cell programatically 【发布时间】:2014-11-21 00:29:41 【问题描述】:

我正在努力解决如何在 uitableviewcell 中动态调整 uilabel 的大小,以及如何根据我放入标签的文本来调整表格单元格的高度。我想在表格视图单元格中完整显示一个字符串,所有单元格的字体大小始终相同。这似乎很标准,但我注意到 *** 上有很多讨论/辩论/不满。我开始使用这些帖子:

Resize Custom cell with a UILabel on it based on content text from JSON file(@Seya 的回答) boundingRectWithSize for NSAttributedString returning wrong size(@JOM 的回答)

我尝试使用的功能是 Seya 所做的复制,几乎没有修改。但是,我看到虽然该函数为不同的单元格打印出不同的高度,但我所看到的只是每个标签 1 行文本,即使它们应该显示很多行。此外,奇怪的是来自一个单元格的文本似乎显示在另一个单元格的顶部 - 不确定这是否相关。

我的 2 个问题:(1)为什么我只看到第一行文字? (2) 为什么 UILabel/cell 没有根据我在日志中看到的不同高度调整大小(或者它们是否在调整大小但被问题 #1 掩盖)?

这是我正在使用的三个函数(这些以及 xib - xib 可能是问题吗?):

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath

JudgeCell *cell = [tableView dequeueReusableCellWithIdentifier:@"JudgeCell"];
    if(!cell)
    
        [tableView registerNib:[UINib nibWithNibName:@"JudgeCell" bundle:nil] forCellReuseIdentifier:@"JudgeCell"];
        cell = [tableView dequeueReusableCellWithIdentifier:@"JudgeCell"];
    

    cell.username.text = self.object.answerUser[indexPath.row];
    cell.answer.text = self.object.answerArray[indexPath.row];

    NSString *text = cell.answer.text;
    CGSize constraint = CGSizeMake(50, 20000.0f);
    CGSize size = [self frameForText:text sizeWithFont:[UIFont systemFontOfSize:15] constrainedToSize:constraint];

    cell.username.frame = CGRectMake(10, 10, 50, size.height); //MAX(size.height, 14.0f));

    return cell;



-(CGSize)frameForText:(NSString*)text sizeWithFont:(UIFont*)font constrainedToSize:(CGSize)size  

    NSMutableParagraphStyle * paragraphStyle = [[NSMutableParagraphStyle defaultParagraphStyle] mutableCopy];
    paragraphStyle.lineBreakMode = NSLineBreakByCharWrapping;

    NSDictionary * attributes = @NSFontAttributeName:font,
                                  NSParagraphStyleAttributeName:paragraphStyle
                                  ;


    CGRect textRect = [text boundingRectWithSize:size
                                         options:(NSStringDrawingUsesLineFragmentOrigin|NSStringDrawingUsesFontLeading)
                                      attributes:attributes
                                         context:nil];

    NSLog(@"size is %f ", textRect.size.height);
    return textRect.size;


- (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath;

    NSString *text = self.object.answerArray[indexPath.row];
    CGSize constraint = CGSizeMake(50, 20000.0f);
    CGSize size = [self frameForText:text sizeWithFont:[UIFont systemFontOfSize:15] constrainedToSize:constraint];
    CGFloat height = size.height; //MAX(size.height, 14.0f);
    NSLog(@"size is %f AT INDEX %d", height, indexPath.row);
    return height + 20;

感谢您的建议!

【问题讨论】:

您尝试调用 [cell setNeedsDisplay] 了吗?在 cellForRowAtIndexPath 中设置新大小后? @Priyatham51 是的,我也试过了,但是没有用。 【参考方案1】:

最后,我删除了关联的 nib 文件,不知何故,这似乎与本教程中的代码一起解决了问题(与我上面已经发布的类似):

http://www.cimgf.com/2009/09/23/uitableviewcell-dynamic-height/

请注意,本教程中的方法有时会被标记为已弃用。如果我找到更新的教程,我会发布。

【讨论】:

以上是关于以编程方式动态调整多行 UILabel 和随附的表格视图单元格的主要内容,如果未能解决你的问题,请参考以下文章

以编程方式根据行数动态调整 UILabel 的大小

以编程方式创建的 UILabel 未在旋转时调整大小

如何使用随附的原始 DEMO 代码重新编程 stm32F769 DISCO 板?

如何以编程方式在 UILabel 上设置 sizeToFit 宽度和高度?

stm32f0 uart编程

基于多行 UILabel 自动调整 UIView 的大小