iOS 图片名不带@2x、@3x,简单缩放适配屏幕分辨率

适应场景:图片没有按照iOS标准命名,不带@2x、@3x,需要自己进行缩放。

解决思路:


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、加载资源。

  • 图片引入
iOS 图片名不带@2x、@3x,简单缩放适配屏幕分辨率_第1张图片
ImportImage.png
  • 图片引入后的变化

iOS 图片名不带@2x、@3x,简单缩放适配屏幕分辨率_第2张图片
BuildPhases.png


能看到Build Phases -> Copy Bundle Resources 里面也增加了图片资源,这就是平常使用[NSBundle mainBundle]里面寻找的资源了,包括图片、storyboard、xib等等。imageNamed就会到mainBundle里找到符合名字的图片。

2、屏幕分辨率判断。

为什么常用的是imageNamed而不是imageWithContentsOfFile原因之一也是这个,imageNamed内部应该是做了分辨率判断的,判断的规则很简单,@2x适用2倍屏幕,@3x适用3倍屏幕,其他的都按照1倍处理。至于真正怎么处理的,应该比我的这个缩放要高级一些。(PS:缩放确实是自己能想到的办法)

3、缓存。

imageNamed更常用于图标这类的小图片,因为它做了缓存处理。

你可能感兴趣的:(iOS 图片名不带@2x、@3x,简单缩放适配屏幕分辨率)