SDWebImage源码分析

SDWebImage学习笔记(四): SDWebImageCom

2016-07-08  本文已影响246人  神采飞扬_2015

里面只提供了一个方法:

/**
 *  放缩操作:根据图片中的图片组 或 scale 重新计算返回图片
 *
 *  @param key   键:就是图片的地址
 *  @param image UIImage
 *
 *  @return UIImage
 */
inline UIImage *SDScaledImageForKey(NSString *key, UIImage *image) {
    if (!image) {
        return nil;
    }
    
    if ([image.images count] > 0) {
        // 动画图片数组
        NSMutableArray *scaledImages = [NSMutableArray array];

        for (UIImage *tempImage in image.images) {
            [scaledImages addObject:SDScaledImageForKey(key, tempImage)];
        }

        return [UIImage animatedImageWithImages:scaledImages duration:image.duration];
    }
    else {
        if ([[UIScreen mainScreen] respondsToSelector:@selector(scale)]) {
            CGFloat scale = 1;
            // 比如屏幕为320x480时,scale为1,屏幕为640x960时,scale为2
            if (key.length >= 8) {
                // “@2x.png”的长度为7,所以此处添加了这个判断,很巧妙
                NSRange range = [key rangeOfString:@"@2x."];
                if (range.location != NSNotFound) {
                    scale = 2.0;
                }
                
                range = [key rangeOfString:@"@3x."];
                if (range.location != NSNotFound) {
                    scale = 3.0;
                }
            }

            UIImage *scaledImage = [[UIImage alloc] initWithCGImage:image.CGImage scale:scale orientation:image.imageOrientation];
            image = scaledImage;
        }
        return image;
    }
}

问题:1、很多地方都调用了 scaledImageForKey方法,比如根据key从磁盘缓存中获取图片后已经是一张UIImage了,为什么进一步调用了scaledImageForKey?
命名图片时候以xxx@2x.png、xxx@3x.png结尾,但在创建Image时并不需在后面添加倍数,只需调用[UIImage imageNamed:@"xxxx"]即可,因为Xcode会帮我们根据当前分辨率自动添加后缀。
eg:如果你有一张5050的二倍图片,当你以[UIImage imageNamed:@"xxxx@2x"]的方法加载图片的时候,你会发现图片被拉伸了,它的大小变为100100,这是因为Xcode会自动添加二倍图后缀,以xxx@2x@2x去查找图片,当它找不到的时候就把xxx@2x图片当做一倍图片处理,所以图片的size就变大了,而ScaledImageForKey方法就是解决这件事情,以防url里面包含@"2x"、@"3x"等字符串,从而使图片size变大。

上一篇下一篇

猜你喜欢

热点阅读