iOS根据网络图片的size大小设置UIImageView的大小

有时候在设置UIImageView的大小时候需要根据UIimage的长宽比来自动设置,不让图片原比例失真。

如果是从本地获取到的图片,[UIImage imageNamed:@""];

这样就可以拿到image了,从而获取到image的size。但大多数时候我们都是网络请求拿到的图片,

我们需要

NSData *data = [NSData dataWithContentsOfURL:url];

image = [UIImage imageWithData:data];

这样来得到image,但是在网络慢的情况下,这种同步的请求可能会让线程卡住。

一般情况下我们都是使用SDWebImage这个第三方来加载图片的。但都是用UIimageView来调Sd_webImage 这样的方法直接设置,而不是拿到image后再去设置UIimageView的image,这样我们就没办法先得到size设置好UIimageView的大小再去设置image。

 

在网上找到一个方法解决了这个问题,就是在SDWebImage 中有一个获取缓存的方法,先判断SDWebImage有没有缓存这个图片,有的话就获取,没有再使用

NSData *data = [NSData dataWithContentsOfURL:url];

image = [UIImage imageWithData:data];

来获取

 

代码如下,

//显示单张图片时,固定宽度。

 

    __block CGFloat itemW = 200;

    __block CGFloat itemH = 0;

    if (_photoDataArray.count == 1) {

    

        UIImageView * imageView = [[UIImageView alloc] init];

        NSURL * url = [NSURL URLWithString:_photoDataArray.firstObject];

        [imageView sd_setImageWithURL:url placeholderImage:[UIImage imageNamed:@"placeHolder.jpg"]];

        SDWebImageManager *manager = [SDWebImageManager sharedManager];

        BOOL existBool = [manager diskImageExistsForURL:url];//判断是否有缓存

        UIImage * image;

        if (existBool) {

            image = [[manager imageCache] imageFromDiskCacheForKey:url.absoluteString];

        }else{

            NSData *data = [NSData dataWithContentsOfURL:url];

            image = [UIImage imageWithData:data];

        }

        

        //根据image的比例来设置高度

        if (image.size.width) {

            itemH = image.size.height / image.size.width * itemW;

            

            if (itemH >= itemW) {

                itemW = 120;

                itemH = image.size.height / image.size.width * itemW;

            }

        }

posted @   孙富有(iOS工程师)  阅读(8265)  评论(0编辑  收藏  举报
编辑推荐:
· go语言实现终端里的倒计时
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
阅读排行:
· 分享 3 个 .NET 开源的文件压缩处理库,助力快速实现文件压缩解压功能!
· Ollama——大语言模型本地部署的极速利器
· 使用C#创建一个MCP客户端
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· Windows编程----内核对象竟然如此简单?
点击右上角即可分享
微信分享提示