iOS开发人员遇到后台返回的图片列表没有尺寸怎么办?

10 篇文章 0 订阅

由于此次上线新版本,后台人员开发工期紧张,返给前台的图片没有尺寸,且大小不一,但是美工又对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);
          }
        });
        
    });
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值