由于此次上线新版本,后台人员开发工期紧张,返给前台的图片没有尺寸,且大小不一,但是美工又对UI的美观性有要求,怎么办呢,别慌,让老司机带你飞。
本次加载用到SDWebImage框架,只在cell内部做处理,首先导入头文件,然后开撸,以下代码写在setModel的方法内。
UIImage *cachedImage = [[SDImageCache sharedImageCache] imageFromCacheForKey:imageModel.imgUrlStr];
__weak __typeof(self) weakSelf = self;
if (!cachedImage) {
//防止下载图片耗时操作时界面复用
[self refreshHeightUseImage:nil];
self.descImageView.image = nil;
//下载图片并存储
[[SDWebImageDownloader sharedDownloader] downloadImageWithURL:[NSURL URLWithString: imageModel.imgUrlStr] options:SDWebImageDownloaderScaleDownLargeImages progress:^(NSInteger receivedSize, NSInteger expectedSize, NSURL * _Nullable targetURL) {
} completed:^(UIImage * _Nullable image, NSData * _Nullable data, NSError * _Nullable error, BOOL finished) {
[[SDImageCache sharedImageCache] storeImage:image forKey: imageModel.imgUrlStr toDisk:YES completion:nil];
[weakSelf refreshHeightUseImage:image];
[weakSelf refreshImageViewUseImage:image andDownloadUrl: imageModel.imgUrlStr];
//回调刷新UI
if (weakSelf.refreshBlock) {
weakSelf.refreshBlock(currentIndexPath);
}
}];
}else{
[self refreshHeightUseImage:cachedImage];
[self refreshImageViewUseImage:cachedImage andDownloadUrl: imageModel.imgUrlStr];
}
}
- (void)refreshHeightUseImage:(UIImage *)image
{
//如果图片不存在,给默认高度,具体根据自己需求定高度
if (image && image.size.width != 0) {
[self.descImageView mas_remakeConstraints:^(MASConstraintMaker *make) {
make.edges.mas_equalTo(0.0);
make.width.mas_equalTo([UIScreen mainScreen].bounds.size.width);
make.height.mas_equalTo([UIScreen mainScreen].bounds.size.width * (image.size.height/image.size.width));
}];
} else {
[self.descImageView mas_remakeConstraints:^(MASConstraintMaker *make) {
make.edges.mas_equalTo(0.0);
make.width.mas_equalTo([UIScreen mainScreen].bounds.size.width);
make.height.mas_equalTo(200.0);
}];
}
}
- (void)refreshImageViewUseImage:(UIImage *)image andDownloadUrl:(NSString *)urlStr
{
if (image && image.size.width != 0) {
CGFloat maxIphoneScreenMaxSizeWidth = [UIScreen mainScreen].bounds.size.width * [UIScreen mainScreen].scale;
if(image.size.width <= maxIphoneScreenMaxSizeWidth) {
self.descImageView.image = image;
} else {
self.descImageView.image = nil;
EB(weakSelf)
[self compressImageWithData:image completed:^(UIImage *newImage) {
weakSelf.descImageView.image = newImage;
[[SDImageCache sharedImageCache] storeImage:newImage forKey:urlStr toDisk:YES completion:nil];
}];
}
} else {
self.descImageView.image = nil;
}
}
//把大图裁切为小图,防止内存溢出
-(void)compressImageWithData:(UIImage *)image completed:(HandleImageEndBlock)completedBlock
{
//开启异步线程防止卡顿
dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_BACKGROUND, 0), ^{
//宽度定为屏幕宽度*屏幕像素倍数
float width = [UIScreen mainScreen].bounds.size.width * [UIScreen mainScreen].scale;
float height = 0;
if (image.size.width != 0) {
height = width * (image.size.height/image.size.width);
}
// 创建一个bitmap的context,并把它设置成为当前正在使用的context
UIGraphicsBeginImageContext(CGSizeMake(width, height));
[image drawInRect:CGRectMake(0, 0, width , height)];
// 从当前context中创建一个改变大小后的图片
UIImage *newImage = UIGraphicsGetImageFromCurrentImageContext();
// 使当前的context出堆栈
UIGraphicsEndImageContext();
dispatch_async(dispatch_get_main_queue(), ^{
if (completedBlock) {
completedBlock(newImage);
}
});
});
}