计算UITableView ContentView高度并不总是正确的

时间:2015-03-10 08:34:06

标签: ios objective-c

我正在创建一个信使应用,它会在两个人之间显示一个对话框。 解析API响应,我收到了收件箱和发件箱消息的文本。然后我使用故事板中的UITableViewCell原型创建一个单元格。 所有约束都已正确调整。

Outer constraints

Inner constraints

问题在于我使用

    [self.tableView scrollToRowAtIndexPath:lastIndexPath atScrollPosition:UITableViewScrollPositionBottom animated:NO];

tableView滚动到底部以使最后一条消息处于焦点,但此时不计算上方单元格的contentView

所以我必须在显示之前计算细胞的高度。为此,我使用

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

    RJMessageCell *cell = [self configureBasicCellAtIndexPath:indexPath];

    [cell setNeedsLayout];
    [cell layoutIfNeeded];
    CGSize maximumSize = CGSizeMake(320.0, UILayoutFittingCompressedSize.height);
    CGFloat height = [cell.contentView systemLayoutSizeFittingSize:maximumSize].height;
    return height;
}    

- (RJMessageCell *)configureBasicCellAtIndexPath:(NSIndexPath *)indexPath {
    static NSString *inboxIdentifier = @"Inbox";
    static NSString *outboxIdentifier = @"Outbox";

    NSString *identifier;

    RJMessage *message = [[[self.messageSectionsArray objectAtIndex:indexPath.section] messages] objectAtIndex:indexPath.row];

    if (message.messageIsMine) {
        identifier = outboxIdentifier;
    } else {
        identifier = inboxIdentifier;
    }


    RJMessageCell *cell = [self.tableView dequeueReusableCellWithIdentifier:identifier];

    cell.messageView.layer.cornerRadius = 10.f;
    cell.messageView.clipsToBounds = YES;
    if ([message.text isEqualToString:@""]) {
        cell.messageTextLabel.text = @" ";
    } else {
        cell.messageTextLabel.text = message.text;
    }
    cell.messageTextLabel.numberOfLines = 0;
    cell.messageTextLabel.lineBreakMode = NSLineBreakByWordWrapping;

    cell.timeLabel.text = [self stringTimeFromTimeInterval:message.messageInterval];

    if (message.messageState == RJMessageStateUnread) {
        cell.backgroundColor = [UIColor colorWithRed:151/255.0 green:200/255.0 blue:255/255.0 alpha:0.4];
    } else {
        cell.backgroundColor = [UIColor clearColor];
    }

    return cell;
}

截图上的UILabel也是自定义的,setBounds是标签

- (void)setBounds:(CGRect)bounds {
    [super setBounds:bounds];

    if (self.numberOfLines == 0 && bounds.size.width != self.preferredMaxLayoutWidth) {
        self.preferredMaxLayoutWidth = self.bounds.size.width;
        [self setNeedsUpdateConstraints];
    }
}

我做的最后一件事,在 viewDidLoad

中添加 estimatedRowHeight
self.tableView.estimatedRowHeight = self.tableView.rowHeight;
self.tableView.rowHeight = UITableViewAutomaticDimension;

他们第一次看起来一切都很好看,但当我上下滚动桌子时,我的细胞会随机改变它们的大小。

When i scroll up

And when i scroll down

细胞高度有什么问题?

1 个答案:

答案 0 :(得分:0)

你必须通过计算文字宽度&来返回高度。你想要放在牢房内的高度。

//Height For Row at index path
- (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath
{
    NSString *cellText = [NSString stringWithFormat:@"%@",[arrDataSource[indexPath.row]]];
    UIFont *cellFont = [UIFont fontWithName:@"Helvetica" size:15.0];

    NSAttributedString *attributedText =
    [[NSAttributedString alloc]
     initWithString:cellText
     attributes:@
     {
     NSFontAttributeName: cellFont
     }];
    CGRect rect = [attributedText boundingRectWithSize:CGSizeMake(tableView.bounds.size.width - 90.0, CGFLOAT_MAX)
                                               options:NSStringDrawingUsesLineFragmentOrigin
                                               context:nil];
    return rect.size.height + 42;
}