UITableView中cell图文高度自适应问题

该方法仅用于后台数据中未给出图片尺寸的情况。

该方法主要有以下几个要点:

  • tableView的加载流程
  1. 获取cell数量
  2. 获取cell高度
  3. 加载cell内容
  • SDWebImage的其它类
  1. SDWebImageDownloader
  2. SDImageCache

具体代码如下:

#pragma mark - Table view datasource and delegate
- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section
{
    return [aArray count];  // aArray 为一个数组,保留每个 cell 对应的 model
}

- (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath
{
    // 先从缓存中查找图片
    UIImage *img = [[SDImageCache sharedImageCache] imageFromDiskCacheForKey: imgKey ];

    // 没有找到已下载的图片就使用默认的占位图,当然高度也是默认的高度了,除了高度不固定的文字部分。
    if (!img) {
        img = CachedImage( placeholder name );
    }

    CGFloat height = [MyCustomCell heightWithImage:img text:text]; // 根据传入的动态内容计算 cell 的高度
    return height;
}

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
    static NSString *identifier = @"Cell Identifier";
    MyCustomCell *cell = [tableView dequeueReusableCellWithIdentifier:identifier];

    // 如果没有可以复用的 cell 就新建一个
    if (!cell) {
        cell = [[MyCustomCell alloc] initWithStyle:UITableViewCellStyleDefault
                                     reuseIdentifier:identifier];
    }

    // 配置 cell
    [self configureCell:cell atIndexPath:indexPath];

    return cell;
}

- (void)configureCell:(MyCustomCell *)cell atIndexPath:(NSIndexPath *)indexPath
{
    // 正常的设置文字和其他内容

    // 开始加载图片
    NSString *imgURL = [self.aArray[indexPath.row] valueForKey: imgKey ];    // 图片 url
    UIImage *cachedImage = [[SDImageCache sharedImageCache] imageFromDiskCacheForKey:imgURL];

    // 没有已经下载好的图片
    if ( !cachedImage ) {
        // 要是当前 table view 没有在被拖动或者自由滑行
        if ( !self.tableView.dragging && !self.tableView.decelerating ) {
            // 下载当前 cell 中的图片
            [self downloadImage:imgURL forIndexPath:indexPath];
        }
        // cell 中图片先用缓存的占位图代替
        [cell setSpitslotImage:CachedImage(@"placeholder")];
    } else {
        // 找到了缓存的图片,直接插缓存的图片
        [cell setSpitslotImage:cachedImage];
    }
}

- (void)downloadImage:(NSString *)imageURL forIndexPath:(NSIndexPath *)indexPath
{
    __weak typeof(self) target = self;

    // 利用 SDWebImage 框架提供的功能下载图片
    [[SDWebImageDownloader sharedDownloader] downloadImageWithURL:URLFromString(imageURL)
    options:SDWebImageDownloaderUseNSURLCache
    progress:^(NSUInteger receivedSize, long long expectedSize) {
     // Do nothing
    }
    completed:^(UIImage *image, NSData *data, NSError *error, BOOL finished) {

    // 保存图片
    [[SDImageCache sharedImageCache] storeImage:image forKey:imageURL toDisk:YES]; // 别忘了保存到磁盘上

    // 延迟在主线程更新 cell 的高度
    [target performSelectorOnMainThread:@selector(reloadCellAtIndexPath:)       // 至于这步的原因是为了防止刷的太快了崩溃
                             withObject:indexPath waitUntilDone:NO];            // 这步会把 selector 的调用放到主线程的 run loop 里排队
    }];                                                                         // 风险就是要是这个队列里排队的比较多,
                                                                                // 这个后插入的方法执行会被延迟
}

// 这个方法没什么好解释的了
- (void)loadImageForOnScreenRows
{
    NSArray *visiableIndexPathes = [self.tableView indexPathsForVisibleRows];

    for(NSInteger i = 0; i < [visiableIndexPathes count]; i++)
    {
        NSString *imgURL = [self.aArray[i] valueForKey: imgKey ];
        [self downloadImage:imgURL forIndexPath:visiableIndexPathes[i]];
    }
}

// 方法名为什么叫这个。。。。是我太懒了,之前写的是刷新某一行的数据,然后发现效率不高,还容易崩溃
// 最后直接刷新全部数据了。。
// 但是别认为调用 table view 的 reloadData 效率就不高,回顾下上面的步骤
// reloadData 实际上就是向代理要行数,要行高,对**显示出来**的 cell 填充数据
// 我的那份代码的瓶颈就是 计算行高和填充数据,不过现在看来没什么不流畅的,所以就没什么问题
// 其实,为了性能考虑,还是最好服务器返回 每个 cell 中的图片的宽高,现在的做法只是临时解决后台xx的问题。。。。。。
- (void)reloadCellAtIndexPath:(NSIndexPath *)indexPath
{
    [self.tableView reloadData];
}

#pragma mark - Scroll view delegate
- (void)scrollViewDidEndDragging:(UIScrollView *)scrollView willDecelerate:(BOOL)decelerate
{   
    // table view 停止拖动了
    if (!decelerate) {
        [self loadImageForOnScreenRows];
    }
}

- (void)scrollViewDidEndDecelerating:(UIScrollView *)scrollView
{
    // table view 停止滚动了
    [self loadImageForOnScreenRows];
}

摘自:http://www.tuicool.com/articles/iMNrAf

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 220,809评论 6 513
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 94,189评论 3 395
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 167,290评论 0 359
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 59,399评论 1 294
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 68,425评论 6 397
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 52,116评论 1 308
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,710评论 3 420
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 39,629评论 0 276
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 46,155评论 1 319
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 38,261评论 3 339
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 40,399评论 1 352
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 36,068评论 5 347
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,758评论 3 332
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 32,252评论 0 23
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 33,381评论 1 271
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 48,747评论 3 375
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 45,402评论 2 358

推荐阅读更多精彩内容

  • 前不久做了一个生成快照的需求,其中用到 SDWebImage 来下载图片,在使用该框架的过程中也遇到了一些问题,索...
    ShannonChenCHN阅读 14,079评论 12 241
  • SDWebImage托管在github上。https://github.com/rs/SDWebImage 这个类...
    XLsn0w阅读 716评论 0 0
  • 项目中一直都有使用SDWebImage,对这个框架有一定的了解,但是体系却未能贯通,因此特地整理下,主要参考: i...
    林大鹏阅读 1,471评论 2 13
  • SDWebImage[https://github.com/rs/SDWebImage] 分析 Version 4...
    wyanassert阅读 1,923评论 0 8
  • 1. 下午2:00 L1-L2英语角 2. 下午3:00或7:00 有Aaron老师英语角 3. 距离Lisa老师...
    Simon_Sun_阅读 208评论 0 0