在开发中遇到了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. Blazor入手教程(一)前言

    Blazor入手教程(一)前言 结论 最近在学习blazor.得出了这么一个结论: Blazor是一门很值得学习的技术,未来.net下将会有相当多的 web应用使用blazor开发.十分看好这一技术, ...

  2. 如何使用ABBYY FineReader 的用户模式?

    在运用ABBYY FineReader 15(Windows系统)进行文档识别时,用户可能会遇到识别的文档包含一些特殊字符或者其他软件无法识别的字体等情况,容易造成识别出现乱码的结果.在这种情况下,用 ...

  3. MathType中怎么编辑韩文字符

    用MathType编辑公式,所涉及到符号与字母一般都是英文字母与数字,或者使用希腊字母,当然还有很多使用中文的情况.但是不仅如此,我们在使用MathType时,除了这些字符之外,还可以输入韩文或者日文 ...

  4. IDM下载器添加支持自动下载的文件类型

    不知道各位读者老爷有没有试过IDM下载器的自动下载功能,对于经常需要下载素材资源的朋友来说,一个个的选择图片或者其他什么素材来下载也是够烦的,IDM的自动下载功能可谓是十分好用,而且自动下载+批量下载 ...

  5. jQuery 第二章 实例方法 DOM操作取赋值相关方法

    取赋值相关方法:  .html() .text() .val() .size() .addClass() .removeClass() .hasClass() .html() html方法干嘛的呢,底 ...

  6. spring中的事务传播机制

    1.事务的实现思想 在spring中要想某个方法具有事务,只要在方法前加一个@Transactional注解.然后spring就会利用aop思想,在这个方法执行前开启事务, 在方法执行后选择提交事务或 ...

  7. Logstash使用mongodb插件报错: ArgumentError: wrong number of arguments (given 2, expected 1)

    目录 背景 安装插件过程 背景 今天在使用logstash收集日志存储到mongodb的安装过程遇到了个错误,记录下来,错误就是下面这样: 配置文件很简单,由于是测试环境,命令行传入日志输入由ruby ...

  8. iOS7使用iOS8上的方法报错处理

    问题描述 我们经常会遇到在低版本上使用高版本方法导致的bug,例如: WebKit discarded an uncaught exception in the webView:decidePolic ...

  9. 图像分割必备知识点 | Unet详解 理论+ 代码

    文章转自:微信公众号[机器学习炼丹术].文章转载或者交流联系作者微信:cyx645016617 喜欢的话可以参与文中的讨论.在文章末尾点赞.在看点一下呗. 0 概述 语义分割(Semantic Seg ...

  10. 关于深度学习之中Batch Size的一点理解(待更新)

    batch 概念:训练时候一批一批的进行正向推导和反向传播.一批计算一次loss mini batch:不去计算这个batch下所有的iter,仅计算一部分iter的loss平均值代替所有的. 以下来 ...