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;
}
}