1. 程式人生 > >UITableView-hightForRow呼叫時刻-Cell行高計算和快取Cell行高

UITableView-hightForRow呼叫時刻-Cell行高計算和快取Cell行高

一、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;
}