自定义cell的高度设定
2017-03-08 本文已影响73人
陈水寒
自定义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;
}