IOS UITableView 加载未知宽高图片的解决方案
在开发中遇到了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 加载未知宽高图片的解决方案的更多相关文章
- table-cell实现未知宽高图片,文本水平垂直居中在div
<BODY> <h1>未知宽高的图片水平垂直居中在div</h1> <!--box-outer--> <div class="box-o ...
- iOS - UITableView加载网络图片 cell适应图片高度
使用xib创建自定制cell 显示图片 创建一个继承UITableViewCell的类 勾选xib 如下是xib创建图 xib 向.h拖拽一个关联线 .h .m 2.代码创建(使用三方适配 ...
- android ImageLoader 混淆加载drawable出现黑色图片的解决方案
在网上找了很久,没有找到.后来看了源码才知道... 多线程异步加载和显示图片(图片来源于网络.sd卡.assets文件夹,drawable文件夹(不能加载9patch),新增加载视频缩略图) Stri ...
- 未知宽高图片水平垂直居中在div
<BODY> <div class="box"> <span class="car"></span> <i ...
- iOS WebView 加载本地资源(图片,文件等)
https://www.cnblogs.com/dhui69/p/5596917.html iOS WebView 加载本地资源(图片,文件等) NSString *path = [[NSBundle ...
- js判断图片加载完成后获取图片实际宽高
通常,我们会用jq的.width()/.height()方法获取图片的宽度/高度或者用js的.offsetwidth/.offsetheight方法来获取图片的宽度/高度,但这些方法在我们通过样式设置 ...
- 【iOS入门】UITableView加载图片
学习带图片的列表 官方 LazyTableImages demo http://download.csdn.net/detail/jlyidianyuan/5726749 分析源码是学习的好方法. ...
- iOS网络加载图片缓存策略之ASIDownloadCache缓存优化
iOS网络加载图片缓存策略之ASIDownloadCache缓存优化 在我们实际工程中,很多情况需要从网络上加载图片,然后将图片在imageview中显示出来,但每次都要从网络上请求,会严重影响用 ...
- div+css实现未知宽高元素垂直水平居中
div+css实现未知宽高元素垂直水平居中.很多同学在面试的时候都会遇到这样的问题:怎么用div+css的方法实现一个未知宽高的弹出框(或者图片)垂直水平居中??如果用JS的话就好办了,但是JS的使用 ...
随机推荐
- mac 快键键图标对应
Mac 键盘快捷键 您可以按下某些组合键来实现通常需要鼠标.触控板或其他输入设备才能完成的操作. 要使用键盘快捷键,请按住一个或多个修饰键,然后按快捷键的最后一个键.例如,要使用 Command- ...
- Model class apps.goods.models.GoodsType doesn't declare an explicit app_label and isn't in an application in INSTALLED_APPS
在admin.py注册这个model时,报了个错: RuntimeError: Model class apps.goods.models.GoodsType doesn't declare an e ...
- 正则表达式——maltrail工程项目中使用
1. 正则表达所需语法 \ 正则表达式使用反斜杠字符 ('') 来表示特殊形式或是允许在使用特殊字符时不引发它们的特殊含义. 转义特殊字符(允许你匹配 '*', '?', 或者此类其他) \A 只匹配 ...
- OCR之前这些因素必须考虑到!
用久了ABBYY FineReader 14OCR文字识别软件,相信大家都知道图像质量对OCR质量有很大的影响,本文将给大家讲解下在识别图像之前,有哪些因素需要考虑到! 1.OCR语言 ABBYY F ...
- FL studio系列教程(十):FL Studio中如何新建样本
FL Studio中强调以样本为核心的编曲模式.样本其实就是一个小的音序片段,可以是单独的乐器或单独的打击乐,还可以是他们组合的一个小音序片段,它是我们学习编曲的最基础知识.所以本文主要为大家讲解的是 ...
- 实用简易的U盘修复工具推荐
如果我们的U盘出现可以读取,但不能打开,或是提示格式化的情况,那可能是U盘硬件出现了问题.U盘内部部件损坏就只能维修了,如果是u盘出现逻辑错误,常用的解决方法就是到网上下载一个u盘修复工具,对u盘进行 ...
- Vuex form表单处理, 比官网更好的办法
Vuex form表单处理, 比官网更好的办法 问题, 当使用vuex的state作为表单的v-model元素, 虽然简单粗暴, 但这种修改没有经过mutation方法. 在严格模式下会抛出错误 目录 ...
- jsp自定义错误页
1.在可能出错页面的Page标签上errorPage="/Error.jsp"指定错误页 2.Error,jsp的page标签中isErrorPage="true&quo ...
- 写给程序员的机器学习入门 (九) - 对象识别 RCNN 与 Fast-RCNN
因为这几个月饭店生意恢复,加上研究 Faster-RCNN 用掉了很多时间,就没有更新博客了.这篇开始会介绍对象识别的模型与实现方法,首先会介绍最简单的 RCNN 与 Fast-RCNN 模型,下一篇 ...
- csust T1097 “是时候表演真正的技术了” 题解(虚点跑最短路)
题目链接 题目大意 给你n个点m条路,以及k个宝藏点,q次查询要你求出距离这个点最近的宝藏点的距离 题目思路 一个套路题,建立虚点与k个点连一个权值为0的边,跑最短路即可 注意边多了4000条 代码 ...