根据标签文本长度动态自定义 UITableViewCell 的高度

Posted

技术标签:

【中文标题】根据标签文本长度动态自定义 UITableViewCell 的高度【英文标题】:Dynamic custom UITableViewCell's height based on label text length 【发布时间】:2014-11-06 04:34:12 【问题描述】:

我是 Xcode 和 Objective-C 的菜鸟,我需要帮助来根据标签中有多少字符来制作动态表格视图单元格的高度。所以它会是这样的: 如果 textLabel char 大于 10,它会将 listHeight 调整为 50 否则,如果 textLabel char 大于 20,它会将 listHeight 调整为 70 等等……

这就是我的编码方式:

NSLong *text;

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

   static NSString *cellID = @"ChatTableViewCell";
   ChatTableViewCell *cell = (ChatTableViewCell *)[tableView dequeueReusableCellWithIdentifier:cellID];

   if (cell == nil)
      NSArray *nib = [[NSBundle mainBundle] loadNibNamed:@"ChatTableViewCell" owner:self options:nil];
      cell = [nib objectAtIndex:0];
   

   Chat * chatObject;
   chatObject = [chatArray objectAtIndex:indexPath.row];
   cell.nameChat.text = chatObject.name;
   cell.messageChat.text = chatObject.message;
   cell.messageChat.lineBreakMode = UILineBreakModeTailTruncation;
   cell.messageChat.numberOfLines = 0;
   cell.dateChat.text = chatObject.time_entry;

   //attached foto
   NSString *setPhoto=chatObject.photo;
   [cell.imageChat setImage:[UIImage imageWithData:[NSData dataWithContentsOfURL:[NSURL URLWithString:[NSString stringWithFormat:@"http://localhost/summit/www/media/user/photo/%@",setPhoto]]]]];
   cell.imageChat.layer.cornerRadius=cell.imageChat.frame.size.height /2;;
   cell.imageChat.layer.masksToBounds = YES;
   cell.imageChat.layer.borderWidth = 0;
   if (cell.imageChat.image==nil) 
      cell.imageChat.image=[UIImage imageNamed:@"profile.png"];
   

   text=[cell.messageChat.text length];
   return cell;

我正在尝试这个,但不工作:

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

   CGFloat height;
   if(text>=10)
      height=100;
   
   else
      height=70;
   return height;

请帮助我,我很想这样做@_@提前谢谢

【问题讨论】:

您提供了一个构造单元格的示例,但未定义其高度。你实现了tableView:heightForRowAtIndexPath: 方法了吗?你试过什么?此外,您真的希望高度取决于字符数还是要确保单元格足够大以容纳其中包含的任何文本? 我有方法但是现在它只包含静态值 return 70; 我认为您需要更好地定义您认为可以计算正确单元格高度的规则,即使您不确定如何在代码中表达它们。否则,这里的任何答案都只是对您尝试做的事情的猜测。您的单元格似乎包含许多文本,其中哪些会影响单元格的高度? 【参考方案1】:

试试这个:

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

    // Fetch yourText for this row from your data source..
    NSString *yourText = [yourArray objectAtIndex:indexPath.row];

    CGSize labelWidth = CGSizeMake(300, CGFLOAT_MAX); // 300 is fixed width of label. You can change this value
    CGRect textRect = [visitorsPerRegion boundingRectWithSize:labelWidth options:NSStringDrawingUsesLineFragmentOrigin|NSStringDrawingUsesFontLeading attributes:@NSFontAttributeName:[UIFont fontWithName:@"CenturyGothic" size:16.0] context:nil];

    /* Here, you will have to use this requiredSize 
       and based on that, adjust height of your cell.
       I have added 10 on total required height of
       label and it will have 5 pixels of padding 
       on top and bottom. You can change this too. */

    int calculatedHeight = textRect.size.height+10;
    return (float)calculatedHeight;

? 希望它有效!

【讨论】:

sizeWithFont:constrainedToSize:lineBreakMode: 在 ios 7 中已被弃用。您应该使用 boundingRectWithSize:options:attributes:context: 代替。 此方法现已弃用,请使用BOUND TO RECT 代替上述方法【参考方案2】:

如果您想使用动态文本大小,@Pratik 的答案的替代方案将类似于单元格上的类方法。

我们在工作中所做的是

+ (CGFloat)cellHeightForTitle:(NSString*)title inTableView:(UITableView*)tableView
    UIFont *font = [UIFont preferredFontForTextStyle:UIFontTextStyleBody];
    NSString *text = title ?: @"test"; // Just some text
    CGFloat hotizontalPadding = 0; // account for other content for calculating width of the cell
    CGFloat desiredWidth = tableView.bounds.size.width - hotizontalPadding;
    NSAttributedString *attributedText = [[NSAttributedString alloc] initWithString:text attributes:@NSFontAttributeName: font];

    UILabel *label = [[UILabel alloc] init];

    label.attributedText = attributedText;
    label.numberOfLines = 0;
    label.lineBreakMode = NSLineBreakByWordWrapping;
    CGSize size = [label sizeThatFits:CGSizeMake(desiredWidth, CGFLOAT_MAX)];

    font = nil;
    attributedText = nil;

    return size.height;

【讨论】:

以上是关于根据标签文本长度动态自定义 UITableViewCell 的高度的主要内容,如果未能解决你的问题,请参考以下文章

根据标签长度调整从 xib 创建的视图大小

根据标签文本自定义 UICollectionViewCell 自身大小

从多节 UITableView 中的自定义静态单元格中检索标签文本

UITableViewCell,使用多个标签设置动态高度

具有动态高度的自定义视图作为 UITableView 标题 ios xcode

根据标签文本动态改变单元格高度