UITableView-hightForRow呼叫時刻-Cell行高計算和快取Cell行高
阿新 • • 發佈:2018-12-14
一、hightForRow呼叫時刻
這個方法的特點:
1.預設情況下
1> 每次重新整理表格時,有多少資料,這個方法就一次性呼叫多少次(比如有100條資料,每次reloadData時,這個方法就會一次性呼叫100次)
2> 每當有cell進入螢幕範圍內,就會呼叫一次這個方法
- (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath { }
二、Cell行高計算和快取Cell行高
①用全域性屬性統計計算:
/** 用來快取cell的高度(key:模型,value:cell的高度) */ @property (nonatomic, strong) NSMutableDictionary *cellHeightDict; - (NSMutableDictionary *)cellHeightDict { if(!_cellHeightDict) { _cellHeightDict = [NSMutableDictionary dictionary]; } return _cellHeightDict; } //Cell行高計算和快取Cell行高 - (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath { HKTopic *topic = self.topics[indexPath.row]; NSString *key = topic.description; CGFloat cellHeight= [self.cellHeightDict[key] doubleValue]; if (cellHeight == 0) { // 這個模型對應的cell高度還沒有計算過 // 文字的Y值 cellHeight += 55;//頂部頭像+margin // 文字的高度 CGSize textMaxSize = CGSizeMake(SCREEN_WIDTH - 2 * HKMargin, MAXFLOAT); cellHeight += [topic.text boundingRectWithSize:textMaxSize options:NSStringDrawingUsesLineFragmentOrigin attributes:@{NSFontAttributeName : [UIFont systemFontOfSize:15]} context:nil].size.height + HKMargin; // 工具條 cellHeight += 35 + HKMargin; // 儲存高度 self.cellHeightDict[key] = @(cellHeight); // [self.cellHeightDict setObject:@(cellHeight) forKey:key]; HKLog(@"%zd %f", indexPath.row, cellHeight); } return cellHeight; } //最後在請求成功時,刪除快取 // 清除之前計算的高度 [self.cellHeightDict removeAllObjects];
②利用模型屬性計算和快取Cell行高
/** 所有的帖子資料 */ @property (nonatomic, strong) NSMutableArray<HKTopic *> *topics; //HKTopic資料模型類: //HKTopic.h 宣告一個屬性用來快取Cell行高 /* 額外增加的屬性(並非伺服器返回的屬性,僅僅是為了提高開發效率) */ /** 根據當前模型計算出來的cell高度 */ @property (nonatomic, assign) CGFloat cellHeight; //HKTopic.m @implementation HKTopic - (CGFloat)cellHeight { // 如果已經計算過,就直接返回 if (_cellHeight) return _cellHeight; JKFunc; // 文字的Y值 _cellHeight += 55; // 文字的高度 CGSize textMaxSize = CGSizeMake(SCREEN_WIDTH - 2 * HKMargin, MAXFLOAT); _cellHeight += [self.text boundingRectWithSize:textMaxSize options:NSStringDrawingUsesLineFragmentOrigin attributes:@{NSFontAttributeName : [UIFont systemFontOfSize:15]} context:nil].size.height + HKMargin; // 工具條 _cellHeight += 35 + HKMargin; return _cellHeight; } @end //使用: /** 這個方法的特點: 1.預設情況下 1> 每次重新整理表格時,有多少資料,這個方法就一次性呼叫多少次(比如有100條資料,每次reloadData時,這個方法就會一次性呼叫100次) 2> 每當有cell進入螢幕範圍內,就會呼叫一次這個方法 */ - (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath { // HKTopic *topic = self.topics[indexPath.row]; // return topic.cellHeight; return self.topics[indexPath.row].cellHeight; }