适应场景:图片没有按照iOS标准命名,不带@2x、@3x,需要自己进行缩放。
解决思路:
<p>
1、修改文件名,给所有图片都重命名。因为不同分辨率图片都按照文件夹分类好了,只需要到对应文件夹修改名字就好。这个在我的场景下不成功。
2、缩放图片,重新绘制图片。对于特别大的图片,性能会存在问题,所以只适用于本地的小图片。
- (UIImage *)autoScaleImageWithName:(NSString *)name
{
UIImage *image = [UIImage imageNamed:name];
CGFloat scale = [UIScreen mainScreen].scale;
CGSize size = CGSizeApplyAffineTransform(image.size, CGAffineTransformMakeScale(1/scale, 1/scale));
UIGraphicsBeginImageContextWithOptions(size, NO, scale);
[image drawInRect:(CGRectMake(0, 0, size.width, size.height))];
UIImage *returnImage = UIGraphicsGetImageFromCurrentImageContext();
UIGraphicsEndImageContext();
return returnImage;
}
简单之后:
猜测一下imageNamed的实现方式
1、加载资源。
<p>
- 图片引入
- 图片引入后的变化
<p>
能看到
Build Phases -> Copy Bundle Resources
里面也增加了图片资源,这就是平常使用[NSBundle mainBundle]
里面寻找的资源了,包括图片、storyboard、xib等等。imageNamed
就会到mainBundle
里找到符合名字的图片。
2、屏幕分辨率判断。
为什么常用的是imageNamed
而不是imageWithContentsOfFile
原因之一也是这个,imageNamed
内部应该是做了分辨率判断的,判断的规则很简单,@2x适用2倍屏幕,@3x适用3倍屏幕,其他的都按照1倍处理。至于真正怎么处理的,应该比我的这个缩放要高级一些。(PS:缩放确实是自己能想到的办法)
3、缓存。
imageNamed
更常用于图标这类的小图片,因为它做了缓存处理。