4

我有一个具有自定义 UITableViewCells 的 UITableView,这是来自用户的评论。现在,我有 115.0f 高的单元格,但我希望根据评论的长度来改变高度。如果评论超过三行,我希望用户能够选择单元格,并且单元格展开以显示整个评论。我一直在使用该[UIView animateWithDuration: completion:方法来扩展单元格,但是我不知道如何根据文本的长度来确定单元格的正确大小。有人可以帮我吗?这是一些代码:

- (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath
{    
    if (indexPath.row == 0)
    {
        return 480;
    }
    else
    {
        if (self.cellType == 0)
        {   
            return 115;
        }
        else
        {
            return 75;
        }
    }
}

- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath
{
    if (indexPath.row > 0)
    {
        NSIndexPath *path = [NSIndexPath indexPathForRow:indexPath.row inSection:indexPath.section];
        UITableViewCell *cell = [tableView cellForRowAtIndexPath:path];
        if ([cell isKindOfClass:[CommentCell class]])
        {
            CommentCell *cell = (CommentCell *)[tableView cellForRowAtIndexPath:indexPath];
            UILabel *label = cell.commentBodyLabel;
            NSString *theText = label.text;
            CGSize constraintSize = CGSizeMake(label.frame.size.width, label.frame.size.height);
            CGSize labelSize = [theText sizeWithFont:label.font constrainedToSize:constraintSize lineBreakMode:label.lineBreakMode];
            CGFloat labelHeight = labelSize.height;
            int numLines = (int)(labelHeight/label.font.leading);
            NSLog(@"there are %i lines", numLines);
            NSLog(@"The text height is %f", labelHeight);
            if (numLines == 3)
            {
                //This is where I should expand the cell
            }
        }
4

2 回答 2

1

看看NSString UIKit Additions

你特别感兴趣sizeWithFont:constrainedToSize:lineBreakMode:

CGSize.widthconstrainedToSize 属性设置为单元格/标签区域的宽度。然后将 设置CGSize.height为一个非常大的数字,可能CGFLOAT_MAX. 这个想法是你在说“嘿,这个标签必须适合一个静态宽度的区域,但它可以永远在垂直方向上。所以,告诉我这个标签实际上有多高,我给你的信息。”

NSString *comment = @"Some really long comment that does not fit in the standard cell size. This comment will be wrapped by word. Some more words to make this longer...";

CGSize renderedSize = [comment sizeWithFont:myFont constrainedToSize:CGSizeMake(kCellWidth, CGFLOAT_MAX) lineBreakMode:NSLineBreakByWordWrapping];

renderedSize.height是您要返回的值(CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath

于 2013-05-31T19:27:17.307 回答
1

一种方法是实例化原型单元并让它们根据给定数据计算其动态高度。此方法允许您依赖故事板布局(如果您使用故事板),而无需在视图控制器中硬编码单元格配置的知识。

编辑我使用TLIndexPathTools添加了一个带有动态高度标签的单元格的工作示例,如果您的单元格实现了TLDynamicHeightView协议,它会自动为您计算动态高度。请参阅“动态高度”示例项目。高度计算在单元格中完成,如下所示:

@interface DynamicHeightCell ()
@property (nonatomic) CGSize originalSize;
@property (nonatomic) CGSize originalLabelSize;
@end

@implementation DynamicHeightCell

- (void)awakeFromNib
{
    [super awakeFromNib];
    self.originalSize = self.bounds.size;
    self.originalLabelSize = self.label.bounds.size;
}

- (void)configureWithText:(NSString *)text
{
    self.label.text = text;
    [self.label sizeToFit];
}

#pragma mark - TLDynamicSizeView

- (CGSize)sizeWithData:(id)data
{
    [self configureWithText:data];
    CGSize labelSize = self.label.bounds.size;
    CGSize size = self.originalSize;
    size.width += labelSize.width - self.originalLabelSize.width;
    size.height += labelSize.height - self.originalLabelSize.height;
    return size;
}

@end

本质上,当单元格从情节提要中唤醒时,您会记住原始大小。然后在执行计算时,调用sizeToFit标签并使用新尺寸计算高度增量并将其添加到原始高度。在情节提要中,您需要将标签的宽度设置为所需的宽度,并将数字行设置为 0。

在视图控制器方面,如果您使用TLIndexPathTools,您只需要使用字符串数组设置数据模型并在单元格上设置标签。原型和尺寸计算由基TLTableViewController类自动完成。如果您不想使用TLIndexPathTools,则从中提取位TLTableViewController应该可以帮助您。

@implementation DynamicHeightTableViewController

- (void)viewDidLoad
{
    [super viewDidLoad];

    self.indexPathController.items = @[
          @"Lorem ipsum dolor sit amet, consectetur adipiscing elit.",
          @"Fusce ac erat at lectus pulvinar porttitor vitae in mauris. Nam non eleifend tortor.",
          @"Quisque tincidunt rhoncus pellentesque.",
          @"Duis mauris nunc, fringilla nec elementum nec, lacinia at turpis. Duis mauris nunc, fringilla nec elementum nec, lacinia at turpis. Class aptent taciti sociosqu ad litora torquent per conubia nostra, per inceptos himenaeos.",
          ];
}

- (void)configureCell:(UITableViewCell *)cell atIndexPath:(NSIndexPath *)indexPath
{
    NSString *item = [self.indexPathController.dataModel itemAtIndexPath:indexPath];
    DynamicHeightCell *dynamicCell = (DynamicHeightCell *)cell;
    [dynamicCell configureWithText:item];
}
于 2013-05-31T19:29:43.983 回答