iOS開發人員遇到後臺返回的圖片列表沒有尺寸怎麼辦?

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

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章