美文网首页在项目中踩过的坑
SDWebImage从3.7升级到4.0的一个问题

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

作者: 子达如何 | 来源:发表于2017-06-22 15:09 被阅读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;
        }
    }
    

    相关文章

      网友评论

        本文标题:SDWebImage从3.7升级到4.0的一个问题

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