在tableview ios中使用UILabel的单元格的动态高度

Posted

技术标签:

【中文标题】在tableview ios中使用UILabel的单元格的动态高度【英文标题】:Dynamic height of cell with UILabel in tableview ios 【发布时间】:2015-02-02 15:33:33 【问题描述】:

我正在开发一个显示用户消息和图像的聊天应用程序。我有一个表格视图和一个自定义单元格。单元格有一个 UIlabel 和 UIImage。我尝试了各种方法来根据标签的内容文本动态调整单元格高度。我在情节提要本身中设置了 numberofLines=0 并将单元格的高度设置为常数,以便可以容纳多行. 但它没有显示多行,至于高度,我使用了自动尺寸,但效果不佳。我还使用了以下link 我正在使用 messageTableViewCell 类型的自定义单元格,其中有一个 label 属性。

这是快照:-

我在 viewcontroller.m 中的代码

- (void)viewDidLoad


   self.tableView.estimatedRowHeight = 100.0;

   self.tableView.rowHeight = UITableViewAutomaticDimension;


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


     messageTableViewCell *cell = [self.messageTableView dequeueReusableCellWithIdentifier:@"cell"];

    if (cell == nil) 
    
         cell = [[messageTableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:@"cell"];
    

    cell.messageLabel.text = [_messages objectAtIndex:indexPath.row];
    cell.messageLabel.lineBreakMode = NSLineBreakByWordWrapping;
    cell.messageLabel.numberOfLines=0;
    [cell.messageLabel sizeToFit];
    return cell;

编辑

我在单元格中插入了一个文本视图,而不是标签,并将其修改为:

- (void)textViewDidChange:(UITextView *)textView

    CGFloat fixedWidth = textView.frame.size.width;
    CGSize newSize = [textView sizeThatFits:CGSizeMake(fixedWidth,     MAXFLOAT)];
    CGRect newFrame = textView.frame;
    newFrame.size = CGSizeMake(fmaxf(newSize.width, fixedWidth),   newSize.height);
    textView.frame = newFrame;



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

    static messageTableViewCell *sizingCell = nil;
    static dispatch_once_t onceToken;
    dispatch_once(&onceToken, ^
        sizingCell = [self.messageTableView  dequeueReusableCellWithIdentifier:@"cell"];
   );

    sizingCell.textMessage.text=_messages[indexPath.row];
    CGFloat fixedWidth = sizingCell.textMessage.frame.size.width;
    CGSize newSize = [sizingCell.textMessage     sizeThatFits:CGSizeMake(fixedWidth, MAXFLOAT)];
    CGRect newFrame = sizingCell.textMessage.frame;
    newFrame.size = CGSizeMake(fmaxf(newSize.width, fixedWidth), newSize.height);
    CGFloat height= newFrame.size.height;
    NSLog(@"%f is height ",height);
    return height+5.0f;

但它也不起作用,它切断了文本的上半部分。

【问题讨论】:

试试这个出色的解释:***.com/questions/18746929/… 【参考方案1】:

如果您使用的是 ios 8 以上版本,请试试这个。它适用于我。

cell.messageLabel.text = [_messages objectAtIndex:indexPath.row];
cell.messageLabel.lineBreakMode = NSLineBreakByTruncatingTail;
cell.messageLabel.numberOfLines=0;
return cell;

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

    return UITableViewAutomaticDimension;

- (CGFloat)tableView:(UITableView *)tableView estimatedHeightForRowAtIndexPath:(NSIndexPath *)indexPath 
    return 10.0;

【讨论】:

我确实尝试了Zure 和Ray 的解决方案,但在您得到答案之前它们没有帮助。非常感谢。【参考方案2】:

http://www.raywenderlich.com/73602/dynamic-table-view-cell-height-auto-layout

这可能是我遇到的关于该主题的最佳教程之一。它逐步解释了所有内容,因此您可以根据需要进行调整。

【讨论】:

试过但没有帮助:\ 了解究竟是什么不起作用会很有帮助。另外,请参阅 Koen 在对您的问题的评论中链接的 SO 问题。这是一个极好的资源。其中的示例代码处理 iOS 8 和 7,您可以将它们结合起来支持两者。【参考方案3】:

试试这个:

- (float)getMessageSize:(NSString *)text Width:(float)textWidth

    NSAttributedString *attributedText = [[NSAttributedString alloc] initWithString:text
        attributes:@
            NSFontAttributeName: [UIFont fontWithName:fontNameRefrig size:19.0]
        ];

    CGRect rect = [attributedText boundingRectWithSize:(CGSize)textWidth, CGFLOAT_MAX
        options:NSStringDrawingUsesLineFragmentOrigin
        context:nil];
    CGSize finalSize = rect.size;
    return finalSize.height;

【讨论】:

请注意,对我来说,指向 raywenderlich.com 的链接根本不起作用。您的方法效果很好,稍作调整以考虑单元格的额外高度。【参考方案4】:

试试这个代码

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

return [customcell getCellHeightForText:@"text"];



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

 cell = [ tableView dequeueReusableCellWithIdentifier : @"customCell" ] ;
  CGRect  rect=cell.frame;
  rect.size.height = [customcell getCellHeightForText:@"text"];
 cell.frame=rect;
return cell;

在 customcell.m 文件中

 +(NSInteger) getCellHeightForText:(NSString *) text 
float totalHeight = 0;
float topMargin = 35;
float bottomMargin = 30;
CGSize textSize = [text calculateSize:12.0 maxWidth:195 maxHeight:0 lineBreakMode:NSLineBreakByWordWrapping];
totalHeight = totalHeight + textSize.height + topMargin + bottomMargin;
return totalHeight;

【讨论】:

以上是关于在tableview ios中使用UILabel的单元格的动态高度的主要内容,如果未能解决你的问题,请参考以下文章

如何在Objective C中的Custom TableView UILabel上设置数据模型值

使用 tableViewCell 高度调整 UILabel 的高度

iOS7 UILabel 视觉故障

在自定义单元格中调整 iOS 7.1 中的 UILabel 大小

在 UITableViewCell ios 中制作动态 UILabel 高度/宽度?

如何延迟更改 tableView 中的 UILabel 文本