iOS 加载网络图片&瀑布流&cell高度自适应

释放双眼,带上耳机,听听看~!

写在前面吧:
现目前是这样的:有数量不等的图片需要瀑布流显示,每张图片高宽度各有不同
初步思路:根据上述问题需求,可知,使用表视图为最佳方式
关键: 图片高宽度不定,cell需要动态计算高度;图片需做缩放处理,适应屏幕
使用SDWebImage下载图片

思路就如上所述,具体代码如下:

1、计算cell高度(前提是已做好数据请求处理)
- (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath{
// 先从缓存中查找图片
UIImage *image = [[SDImageCache sharedImageCache] imageFromDiskCacheForKey:self.sdwebArr[indexPath.row]];
if (!image) {
image = [UIImage imageNamed:@"store_no_data"];
}
//H = H*(SCREEN_WIDTH/W) = 高度*(屏幕/图片宽)
CGFloat imageHeight = image.size.height * SCREEN_WIDTH/image.size.width;
return imageHeight;
}
2、cellForRowAtIndexPath(调用configureCell: atIndexPath:方法)
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath{
ShopDetailCell *cell = [tableView dequeueReusableCellWithIdentifier:reuseIdentifier];
if (cell == nil) {
cell = [[ShopDetailCell alloc]initWithStyle:UITableViewCellStyleDefault reuseIdentifier:reuseIdentifier];
}
[self configureCell:cell atIndexPath:indexPath];
cell.selectionStyle = UITableViewCellSelectionStyleNone;
return cell;
}
3、调用(downloadImage: forIndexPath:)
- (void)configureCell:(ShopDetailCell *)cell atIndexPath:(NSIndexPath *)indexPath {
NSString *imgURL = self.sdwebArr[indexPath.row];
UIImage *cachedImage = [[SDImageCache sharedImageCache]imageFromDiskCacheForKey:imgURL];
if (!cachedImage) {
[self downloadImage:self.sdwebArr[indexPath.row] forIndexPath:indexPath];
}else{
[cell.imgBtn setBackgroundImage:cachedImage forState:UIControlStateNormal];
}
}
4、下载对应图片、使用GCD回到主线程刷新UI
- (void)downloadImage:(NSString *)imageURL forIndexPath:(NSIndexPath *)indexPath {
[[SDWebImageDownloader sharedDownloader] downloadImageWithURL:[NSURL URLWithString:imageURL] options:SDWebImageDownloaderUseNSURLCache progress:^(NSInteger receivedSize, NSInteger expectedSize, NSURL * _Nullable targetURL) {
//nothing to do
} completed:^(UIImage * _Nullable image, NSData * _Nullable data, NSError * _Nullable error, BOOL finished) {
[[SDImageCache sharedImageCache] storeImage:image forKey:imageURL toDisk:YES completion:^{
}];
dispatch_async(dispatch_get_main_queue(), ^{
[self.detailTableView reloadData];
});
}];
}

 

人已赞赏
iOS文章

Swift基础语法

2020-1-13 14:48:39

iOS文章

Swift - 函数,闭包,解除闭包循环引用

2020-1-13 16:49:17

个人中心
购物车
优惠劵
今日签到
有新私信 私信列表
有新消息 消息中心
搜索