在开发中遇到了UITableView列表 UITableViewCell装载图片但不知Image的宽高 问题。

在解决该问题的时候,首先想到的是异步加载图片 采用第三方框架SDWebImage 实现对图片异步下载和缓存

以下是我采用的方法几个关键地方

1.计算UITableView的高度

- (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath
{ NSString *imgURL = self.electionPictureArray.count > indexPath.row ? self.electionPictureArray[indexPath.row] :nil;
if (imgURL) {
//根据当前Row的ImageUrl作为Key获取图片缓存
UIImage *img = [[SDImageCache sharedImageCache] imageFromDiskCacheForKey: imgURL ];
if (!img) {
img = [UIImage resizedImageWithName:@"childshow_placeholder"];; }
CGFloat height = img.size.height *Main_Screen_Width/img.size.width;//Image宽度为屏幕宽度 ,计算宽高比求得对应的高度
NSLog(@"----------------return Height:%f",height);
return height; }
return 0;
}

2.在UITableViewCell中实现图片的下载,回调下载完成刷新页面代理

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{ ElectronicBookCell *cell = [ElectronicBookCell cellWithTableView:tableView];
cell.imageUrl = self.electionPictureArray.count > indexPath.row ? self.electionPictureArray[indexPath.row] :nil;
cell.selectionStyle = UITableViewCellSelectionStyleNone;
return cell; }

在cell中的setImageUrl中进行下载图片

-(void) setImageUrl:(NSString *)imageUrl{
if (imageUrl) {
_imageUrl = imageUrl;
UIImage *cachedImage = [[SDImageCache sharedImageCache] imageFromDiskCacheForKey:imageUrl];
// 没有缓存图片
if (!cachedImage) {
__weak typeof(self) target = self;
// 利用 SDWebImage 框架提供的功能下载图片
[[SDWebImageDownloader sharedDownloader] downloadImageWithURL:[NSURL URLWithString:imageUrl] options:SDWebImageDownloaderUseNSURLCache progress:^(NSInteger receivedSize, NSInteger expectedSize) { } completed:^(UIImage *image, NSData *data, NSError *error, BOOL finished) {
// 保存图片
[[SDImageCache sharedImageCache] storeImage:image forKey:imageUrl toDisk:YES]; // 保存到磁盘
if (imageUrl == target.imageUrl) {
[target configPreviewImageViewWithImage:image];
}
if ([self.delegate respondsToSelector:@selector(reloadCellAtIndexPathWithUrl:)]) {
[self.delegate reloadCellAtIndexPathWithUrl:imageUrl];
}
}];
}else
{
[self configPreviewImageViewWithImage:cachedImage];
} }
}
/**
* 加载图片成功后设置image's frame
*/
- (void)configPreviewImageViewWithImage:(UIImage *)image
{
_previewWidth = Main_Screen_Width;
_previewHeight = image.size.height *Main_Screen_Width/image.size.width;
CGRect rect = _previewImageView.frame;
rect.size.width = _previewWidth;// image.size.width;
rect.size.height = _previewHeight;
_previewImageView.frame = rect;
_previewImageView.image = image;
[self resetLayoutByPreviewImageView];
}

3.在Controller中实现代理方法,

-(void)reloadCellAtIndexPathWithUrl:(NSString *)url{

    if (url) {
for (int i = 0; i< self.electionPictureArray.count; i++) {
//遍历当前数据源中并找到ImageUrl
NSString *imgURL = self.electionPictureArray.count >i ? self.electionPictureArray[i] :nil;
if ([imgURL isEqualToString:url]) {
//获取当前可见的Cell NSIndexPaths
NSArray *paths = self.tableView.indexPathsForVisibleRows;
//判断回调的NSIndexPath 是否在可见中如果存在则刷新页面
NSIndexPath *pathLoad = [NSIndexPath indexPathForItem:i inSection:0];
for (NSIndexPath *path in paths) {
if (path && path == pathLoad ) {
[self.tableView reloadData];
}
}
}
}
}
}

IOS开发技术交流QQ群:491355147 欢迎加入

 

IOS UITableView 加载未知宽高图片的解决方案的更多相关文章

  1. table-cell实现未知宽高图片,文本水平垂直居中在div

    <BODY> <h1>未知宽高的图片水平垂直居中在div</h1> <!--box-outer--> <div class="box-o ...

  2. iOS - UITableView加载网络图片 cell适应图片高度

    使用xib创建自定制cell   显示图片   创建一个继承UITableViewCell的类   勾选xib 如下是xib创建图 xib 向.h拖拽一个关联线 .h .m 2.代码创建(使用三方适配 ...

  3. android ImageLoader 混淆加载drawable出现黑色图片的解决方案

    在网上找了很久,没有找到.后来看了源码才知道... 多线程异步加载和显示图片(图片来源于网络.sd卡.assets文件夹,drawable文件夹(不能加载9patch),新增加载视频缩略图) Stri ...

  4. 未知宽高图片水平垂直居中在div

    <BODY> <div class="box"> <span class="car"></span> <i ...

  5. iOS WebView 加载本地资源(图片,文件等)

    https://www.cnblogs.com/dhui69/p/5596917.html iOS WebView 加载本地资源(图片,文件等) NSString *path = [[NSBundle ...

  6. js判断图片加载完成后获取图片实际宽高

    通常,我们会用jq的.width()/.height()方法获取图片的宽度/高度或者用js的.offsetwidth/.offsetheight方法来获取图片的宽度/高度,但这些方法在我们通过样式设置 ...

  7. 【iOS入门】UITableView加载图片

    学习带图片的列表 官方 LazyTableImages demo  http://download.csdn.net/detail/jlyidianyuan/5726749 分析源码是学习的好方法. ...

  8. iOS网络加载图片缓存策略之ASIDownloadCache缓存优化

    iOS网络加载图片缓存策略之ASIDownloadCache缓存优化   在我们实际工程中,很多情况需要从网络上加载图片,然后将图片在imageview中显示出来,但每次都要从网络上请求,会严重影响用 ...

  9. div+css实现未知宽高元素垂直水平居中

    div+css实现未知宽高元素垂直水平居中.很多同学在面试的时候都会遇到这样的问题:怎么用div+css的方法实现一个未知宽高的弹出框(或者图片)垂直水平居中??如果用JS的话就好办了,但是JS的使用 ...

随机推荐

  1. 如何使用GitHub创建Maven私有仓库

    [Github上创建仓库] 首先,在GitHub上创建自己的仓库(mvn-repo): [配置本地setting文件] 找到本地的maven settings文件,配置server: 有两种选择,可以 ...

  2. Codeforces375D Tree and Queries

    dsu on tree 题目链接 点我跳转 题目大意 给定一棵 \(n\) 个节点的树,根节点为 \(1\).每个节点上有一个颜色 \(c_i\) \(m\) 次询问. 每次询问给出 \(u\) \( ...

  3. BT下载器Folx标签功能怎么实现自动的资源分类

    很多经典的电影作品,比如魔戒三部曲.蜘蛛侠系列.漫威动画系列等,在一个系列中都会包含多个作品.如果使用Folx bt种子下载器自带的电影标签的话,会将这些系列电影都归为"电影"标签 ...

  4. ABBYY FineReader 15快速转换文档详解

    作为一款专业的"PDF编辑器",用户可通过使用ABBYY FineReader  15的"快速转换"功能,将各种格式的一个或多个文件合并PDF文档.Micros ...

  5. Mac读写ntfs软件究竟哪一款适合我们?

    生活中我们免不了会使用一些硬盘设备来存储文件或者是数据,然而绝大多数的移动硬盘都是ntfs格式.Mac读写ntfs软件有很多,究竟哪一款适合我们? 首先,我们一起了解一下什么是ntfs格式.ntfs, ...

  6. FL Studio里一起安装的ASIO4ALL有什么用?

    在我们安装FL Studio时,正常情况下我们安装FL Studio时最多也就改改安装目录,其他的安装设置一般不会动,但看到FL安装的那些东西我们难道不会感到好奇吗?FL Studio安装包括FL S ...

  7. 写代码有这16个好习惯,可以减少80%非业务的bug

    前言 每一个好习惯都是一笔财富,本文整理了写代码的16个好习惯,每个都很经典,养成这些习惯,可以规避多数非业务的bug!希望对大家有帮助哈,谢谢阅读,加油哦~ github地址,感谢每颗star ❝ ...

  8. ucore操作系统学习(五) ucore lab5用户进程管理

    1. ucore lab5介绍 ucore在lab4中实现了进程/线程机制,能够创建并进行内核线程的调度.通过上下文的切换令线程分时的获得CPU,使得不同线程能够并发的运行. 在lab5中需要更进一步 ...

  9. 课时一:JS操作数据

    课时一:JS操作数据 JSAPI请求头 xmlhttp.setRequestHeader("Content-Type", "application/json; chars ...

  10. Bootstrap(修改中)

    表格 斑马表格 <table class="table-striped"> </table> 鼠标经过表格的hover效果 <table class= ...