美文网首页iOS开发知识小集iOS开发点滴iOS接下来要研究的知识点
iOS开发中获取网络图片的宽高进行自适应适配

iOS开发中获取网络图片的宽高进行自适应适配

作者: 小蜜蜂Bee | 来源:发表于2019-10-12 17:24 被阅读0次

    图片,是我们在iOS开发过程中必不可少的“物资”和伙伴,经常和它打交道。而为了更加完整完美且不变形地显示出来,我们是不是要考虑一下这个问题?说到这里自然而然就要提起UIImageView的显示方式了,关于这个问题简书上有个比较经典的解释,直接上链接 —— UIImageView的使用与图片显示模式
    上面说完了显示方式,那么再来讲讲有关开始提到的问题,怎么完整完美切不变形地显示出来,显示的情况大致是这样子:1、UIImageView的frame固定,起码size固定
    1)size的width宽度固定;
    2)size的height高度固定;

    解决方法:获取图片size之后计算宽高比例,然后根据UIImageView固定的width或者height求解另外一边的数值。其实这样就变成了一个数学题目:已知 a1 / b1,a2或b2的值,求解b2或a2。

    解:a1 / b1 = a2 / x
    x = a2 * b1 / a1
    2、UIImageView的只有约束,宽高可能都不固定

    解决方法:自适应

    总之,关键就是获取到图片的宽高,那么下面就重点来讲讲获取图片的size方法。

    方法一:通过图片网址链接,然后再通过NSData直接UIImage即可获得图片的size

        NSData *data = [NSData dataWithContentsOfURL:[NSURL URLWithString:@"www.baidu.com"]];
        
        UIImage  *image = [UIImage imageWithData:data];
        
        CGSize imageSize = image.size;
    

    方法二:整合方法也可以写成UIImage的分类然后传入图片链接直接获取size,如下:

    /**
     获取网络图片高度
     */
    + (CGSize)getImageSizeWithURL:(id)URL
    {
        NSURL * url = nil;
        if ([URL isKindOfClass:[NSURL class]]) {
            url = URL;
        }
        if ([URL isKindOfClass:[NSString class]]) {
            url = [NSURL URLWithString:URL];
        }
        if (!URL) {
            return CGSizeZero;
        }
        CGImageSourceRef imageSourceRef = CGImageSourceCreateWithURL((CFURLRef)url, NULL);
        CGFloat width = 0, height = 0;
        
        if (imageSourceRef) {
            
            // 获取图像属性
            CFDictionaryRef imageProperties = CGImageSourceCopyPropertiesAtIndex(imageSourceRef, 0, NULL);
            
            //以下是对手机32位、64位的处理
            if (imageProperties != NULL) {
                
                CFNumberRef widthNumberRef = CFDictionaryGetValue(imageProperties, kCGImagePropertyPixelWidth);
                
    #if defined(__LP64__) && __LP64__
                if (widthNumberRef != NULL) {
                    CFNumberGetValue(widthNumberRef, kCFNumberFloat64Type, &width);
                }
                
                CFNumberRef heightNumberRef = CFDictionaryGetValue(imageProperties, kCGImagePropertyPixelHeight);
                
                if (heightNumberRef != NULL) {
                    CFNumberGetValue(heightNumberRef, kCFNumberFloat64Type, &height);
                }
    #else
                if (widthNumberRef != NULL) {
                    CFNumberGetValue(widthNumberRef, kCFNumberFloat32Type, &width);
                }
                
                CFNumberRef heightNumberRef = CFDictionaryGetValue(imageProperties, kCGImagePropertyPixelHeight);
                
                if (heightNumberRef != NULL) {
                    CFNumberGetValue(heightNumberRef, kCFNumberFloat32Type, &height);
                }
    #endif
                /***************** 此处解决返回图片宽高相反问题 *****************/
                // 图像旋转的方向属性
                NSInteger orientation = [(__bridge NSNumber *)CFDictionaryGetValue(imageProperties, kCGImagePropertyOrientation) integerValue];
                CGFloat temp = 0;
                switch (orientation) {  // 如果图像的方向不是正的,则宽高互换
                    case UIImageOrientationLeft: // 向左逆时针旋转90度
                    case UIImageOrientationRight: // 向右顺时针旋转90度
                    case UIImageOrientationLeftMirrored: // 在水平翻转之后向左逆时针旋转90度
                    case UIImageOrientationRightMirrored: { // 在水平翻转之后向右顺时针旋转90度
                        temp = width;
                        width = height;
                        height = temp;
                    }
                        break;
                    default:
                        break;
                }
                /***************** 此处解决返回图片宽高相反问题 *****************/
                
                CFRelease(imageProperties);
            }
            CFRelease(imageSourceRef);
        }
        return CGSizeMake(width, height);
        
    }
    

    方法三:通过 XHWebImageAutoSize来实现(推荐)

    /**
         *  参数1:图片URL
         *  参数2:imageView 宽度
         *  参数3:预估高度,(此高度仅在图片尚未加载出来前起作用,不影响真实高度)
         */
     CGFloat imageHeight = [XHWebImageAutoSize imageHeightForURL:[NSURL URLWithString:@"www.baidu.com"] layoutWidth:width estimateHeight:256];
    

    通过以上几种方法,现在就解决了图片适配的问题了,说说这几种方法特点吧:方法一,使用简便,但是如果使用在tableview的cell时候可能会造成数据显示出来的时间延长,图片数量少的时候可以直接采用;方法二,使用也还可以,同时可以抽取出分类方法,如果使用在tableview的cell时候也可能会造成数据显示出来的时间延长,图片数量少的时候可以直接采用;方法三,使用过程相对复杂一些,但是效果让人很满意,特别是tableview的cell需要大量图片显示时候,建议采用。

    如果以上的分享帮助到你了,欢迎分享,更欢迎赞赏,也可以直接打开支付宝、微信、QQ的扫一扫功能直接扫下面的支付宝、微信、QQ三合一打赏码进行打赏支持作者创作,感谢感谢!

    小蜜蜂的多合一收款码

    欢迎和我交流,QQ:834537795(小蜜蜂)

    相关文章

      网友评论

        本文标题:iOS开发中获取网络图片的宽高进行自适应适配

        本文链接:https://www.haomeiwen.com/subject/ajaqmctx.html