UITableView性能优化(二)

UITableview的行高处理优化,先设置好预估行高,这样系统的执行顺序便是,先创建cell,然后执行代理行高,返回对应cell的高度。
如果没有设置预估行高,执行顺序是先代理行高,再创建cell。

#pragma mark - 
//self.tabview.estimatedHeightForRowAtIndexPath = 200;同代理方法一个效果
- (CGFloat)tableView:(UITableView *)tableView estimatedHeightForRowAtIndexPath:(NSIndexPath *)indexPath
{
    return 200;
}

- (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath
{
    DZMessage *message = self.messages[indexPath.row];
    return message.cellHeight;
}

cell行高的返回,以及不定行高的约束的更新。

- (void)setMessage:(DZMessage *)message
{
    _message = message;
    
    // 时间处理
    if (message.hideTime) { // 隐藏时间
        self.timeLabel.hidden = YES;
        [self.timeLabel updateConstraints:^(MASConstraintMaker *make) {
            make.height.equalTo(0);
        }];
    } else { // 显示时间
        self.timeLabel.text = message.time;
        self.timeLabel.hidden = NO;
        [self.timeLabel updateConstraints:^(MASConstraintMaker *make) {
            make.height.equalTo(21);
        }];
    }
    
    // 处理显示的消息文字
    // 设置按钮的文字
    [self.textButton setTitle:self.message.text forState:UIControlStateNormal];
    
    // 强制更新
    [self layoutIfNeeded];
    
    // 设置按钮的高度就是titleLabel的高度
    [self.textButton updateConstraints:^(MASConstraintMaker *make) {
        CGFloat buttonH = self.textButton.titleLabel.frame.size.height + 30;
        make.height.equalTo(buttonH);
    }];
    
    // 强制更新
    [self layoutIfNeeded];
    
    // 计算当前cell的高度
    CGFloat buttonMaxY = CGRectGetMaxY(self.textButton.frame);
    CGFloat iconMaxY = CGRectGetMaxY(self.iconView.frame);
    self.message.cellHeight = MAX(buttonMaxY, iconMaxY) + 10;
}

你可能感兴趣的:(UITableView性能优化(二))