UITableView在滚动浏览应用时滞后

时间:2014-04-24 17:21:15

标签: ios objective-c uitableview

我正在制作的应用中有聊天功能。每个单元格都有UITextView,我需要计算每个单元格的**height and width**。我这样做,然后缓存该数据。

使用NSLog我已确定数据已正确缓存,并且每行的高度仅被要求一次。

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
    Message *message = [feedItems objectAtIndex:indexPath.row];

    NSString *reuseIdentifier;
    if (message.iSentThisMessage) {
        reuseIdentifier = @"MeCell";
    } else {
        reuseIdentifier = @"HostCell";
    }

    ChatTableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:reuseIdentifier forIndexPath:indexPath];

    // Configure the cell...
    cell.textView.text = message.content;

    if (message.frame.size.height == 0 && message.frame.size.width == 0) {
        CGRect rect = cell.textView.frame;
        rect.origin.x = 5;
        rect.origin.y = 3;
        CGSize size = [self text:message.content
                    sizeWithFont:[UIFont systemFontOfSize:17.0]
               constrainedToSize:CGSizeMake(225.0, CGFLOAT_MAX)];
        rect.size.height = size.height
                            + cell.textView.textContainerInset.bottom
                            + cell.textView.textContainerInset.top;
        rect.size.width = [cell.textView sizeThatFits:CGSizeMake(225.0, rect.size.height)].width
                            + cell.textView.textContainerInset.left
                            + cell.textView.textContainerInset.right;

        if (message.iSentThisMessage) {
            rect.origin.x = 320 - (rect.origin.y + rect.size.width);
        }

        cell.textView.frame = rect;
        message.frame = rect;
        NSLog(@"Not Cached :(");
    } else {
        cell.textView.frame = message.frame;
        NSLog(@"Cached!");
    }

    return cell;
}

- (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath
{
    Message *message = [feedItems objectAtIndex:indexPath.row];
    CGSize size = [self text:message.content
                sizeWithFont:[UIFont systemFontOfSize:17.0]
           constrainedToSize:CGSizeMake(225.0, CGFLOAT_MAX)];

    if (indexPath.row + 1 == feedItems.count)
        size.height += 4;

    NSLog(@"Height asked for.");
    return size.height + 12;
}

另外,另一种可能是我在自定义uitableviewcell类中重写了以下方法,否则它会重新排列我单元格的内容。

- (void) layoutSublayersOfLayer:(CALayer *)layer {

}

我似乎无法弄清楚如何让它不滞后!!

1 个答案:

答案 0 :(得分:0)

不清楚为什么使用文本视图,但如果可以,则应更改为标签。

另外,不要在表委托方法中缓存高度,这是一个讨厌的副作用。在加载/接收消息时,或在后台线程上计算批量加载时,预先计算高度。

文本视图/标签框架也应该相对于单元格,可以通过自动调整大小/布局。所以你永远不应该明确地设置它。

最重要的是 - 使用乐器的配置文件。这是唯一能真正告诉你错误的事情。