tableview的heightForRowAtIndexPat
2017-03-21 本文已影响490人
CoderLNHui
heightForRowAtIndexPath
的调用
- 每次刷新表格时,有多少数据,这个方法就一次性调用多少次(比如有100条数据,每次reloadData时,这个方法就会一次性调用100次)
- 为什么会一次性调用?
苹果需要计算tableView的contentsize,在界面上显示未进度条的长短,防止用户突然加速下拉时,能展示多少内容
- 每当有cell进入屏幕范围内,就会调用一次这个方法
estimatedRowHeight
预设高度的调用
- 用到了(显示了)哪个cell,才会调用这个方法(heightForRowAtIndexPath)计算那个cell的高度(heightForRowAtIndexPath方法调用频率降低了)
使用estimatedRowHeight的优缺点
-
优点
1> 可以降低tableView:heightForRowAtIndexPath:方法的调用频率
2> 将【计算cell高度的操作】延迟执行了(相当于cell高度的计算是懒加载的) -
缺点
1> 滚动条长度不准确、不稳定,甚至有卡顿效果(如果不使用estimatedRowHeight,滚动条的长度就是准确的)
所有cell的高度 -> contentSize.height -> 滚动条长度
1000 * 20 -> contentSize.height -> 滚动条长度
contentSize.height -> 200 * 20 -> 16800
调用实例
@property (nonatomic, strong) NSMutableArray<SHTopic *> *topics;
- (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath
{
return self.topics[indexPath.row].cellHeight;
}
#import <Foundation/Foundation.h>
@interface SHTopic : NSObject
/* 额外增加的属性(并非服务器返回的属性,仅仅是为了提高开发效率) */
/** 根据当前模型计算出来的cell高度 */
@property (nonatomic, assign) CGFloat cellHeight;
@end
@implementation SHTopic
- (CGFloat)cellHeight
{
// 如果已经计算过,就直接返回
if (_cellHeight) return _cellHeight;
// 文字的Y值
_cellHeight += 55;
// 文字的高度
CGSize textMaxSize = CGSizeMake(SHScreenW - 2 * SHMarin, MAXFLOAT);
_cellHeight += [self.text boundingRectWithSize:textMaxSize options:NSStringDrawingUsesLineFragmentOrigin attributes:@{NSFontAttributeName : [UIFont systemFontOfSize:15]} context:nil].size.height + SHMarin;
// 工具条
_cellHeight += 35 + SHMarin;
return _cellHeight;
}
@end