在项目中踩过的坑

SDWebImage从3.7升级到4.0的一个问题

2017-06-22  本文已影响276人  子达如何

如果图片命名没有指定@2x或者@3x的话,3.7.3版本SDWebImage会默认按照屏幕的scale来创建图片。

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 = [UIScreen mainScreen].scale;
            if (key.length >= 8) {
                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;
    }
}

** CGFloat scale = [UIScreen mainScreen].scale; **
到Github的issue里搜索 SDScaledImageForKey 有很多人对这个设计也表示了怀疑,作者有一些回应,有兴趣的同行可以去看看。

而到了4.0之后,不再按照这个规则了,而是默认是1。但是从代码看,好像临时改成1的样子:

#elif SD_UIKIT
        if ([[UIScreen mainScreen] respondsToSelector:@selector(scale)]) {
#endif
            CGFloat scale = 1;

它还保留着对屏幕scale是否可用的if判断。

我想4.0的处理应该是合理的。
想一下,一个100x100像素的图像,如果设计师设计的时候期望它是一个2倍图,也就是说应该占用屏幕50x50个点,但是,3.7的处理使得在Plus机型上就只有33X33个点了。

BTW: 顺便劈了一眼SDWebImage的代码。
图像从磁盘缓存回来之后,需要做三次转换才到最终的图片,这性能真的没问题的吗?好担心。。。。

- (nullable UIImage *)diskImageForKey:(nullable NSString *)key {
    NSData *data = [self diskImageDataBySearchingAllPathsForKey:key];
    if (data) {
        UIImage *image = [UIImage sd_imageWithData:data];
        image = [self scaledImageForKey:key image:image];
        if (self.config.shouldDecompressImages) {
            image = [UIImage decodedImageWithImage:image];
        }
        return image;
    }
    else {
        return nil;
    }
}
上一篇下一篇

猜你喜欢

热点阅读