自定义cell的高度设定

自定义cell的高度

自定义cell的高度需要根据内容不同自动调整,使用tabview的代理方法- (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath进行cell的高度调整时需要注意:

  • 当reloadData时就会调用代理方法,计算所有数据的cell高度,假如有100条数据就会调用100次;
  • 当cell进入屏幕时调用一次;

如果每个cell的高度需要计算,就会带来效率问题(reloadData),所以在写代码的时候需要缓存已经计算过的cell高度,计算过高度的cell被调用时不再进行计算,直接从缓存中取出。

- (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath
{
    // 取出模型数据
    GGTopic *topic = self.topics[indexPath.row];
    /**
     * 以模型数据topic的内存地址为key,高度为value存储到字典中,self.cellHeight为缓存cell高度的字典
     * 取出缓存中的topic对应的高度,如果对应topic没有高度则进行计算,计算完成后保存到字典中
     */
    NSString *key = [NSString stringWithFormat:@"%p",topic];
    CGFloat cellHeight = [self.cellHeight[key] doubleValue]; //如果字典中没有对应的key,则会返回0
    
    if (cellHeight == 0) {     
        NSLog(@"%zd",indexPath.row);
        // 增加头部高度
        cellHeight += 55;
        
        // 增加内容高度
        CGSize textMaxSize = CGSizeMake(GGScreenW - 20, MAXFLOAT);
        //    cellHeight += [topic.text sizeWithFont:[UIFont systemFontOfSize:17] constrainedToSize:textMaxSize].height + GGMargin;
        cellHeight += [topic.text boundingRectWithSize:textMaxSize options:NSStringDrawingUsesLineFragmentOrigin attributes:@{NSFontAttributeName:[UIFont systemFontOfSize:17]} context:nil].size.height + GGMargin;
        
        // 增加底部高度
        cellHeight += 35 + GGMargin;
        
        // 缓存cell的高度
        self.cellHeight[key] = @(cellHeight);
    }

    return cellHeight;
}

你可能感兴趣的:(自定义cell的高度设定)