由於此次上線新版本,後臺人員開發工期緊張,返給前臺的圖片沒有尺寸,且大小不一,但是美工又對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);
}
});
});
}