iOS8与iOS7图片异常及解释

时间:2022-07-08 23:05:19

如果对icon的后缀@2x或@3x理解不够,在iOS7和iOS8下图片会出现显示异常(尺寸减半)

三张图片 red.png(50x30)      red@2x.png(100x60)        red@3x.png(150x90)

测试代码:


UIImage *image1 = [UIImage imageNamed:@"red"];

NSLog(@“%f,%f",image1.size.width,image1.size.height);

UIImageView *imageView1 = [[UIImageView alloc]initWithFrame:CGRectMake(0, 0, image1.size.width, image1.size.height)];

[imageView1 setImage:image1];

[self.view addSubview:imageView1];

    

UIImage *image2 = [UIImage imageNamed:@"red@2x"];

NSLog(@"%f,%f",image2.size.width,image2.size.height);

UIImageView *imageView2 = [[UIImageView alloc]initWithFrame:CGRectMake(0, 100, image2.size.width, image2.size.height)];

[imageView2 setImage:image2];

[self.view addSubview:imageView2];


UIImage *image3 = [UIImage imageNamed:@"red@3x"];

NSLog(@"%f,%f",image3.size.width,image3.size.height);

UIImageView *imageView3 = [[UIImageView alloc]initWithFrame:CGRectMake(0, 200, image3.size.width, image3.size.height)];

[imageView3 setImage:image3];

[self.view addSubview:imageView3];


在iOS7下面显示的效果:

iOS8与iOS7图片异常及解释


在iOS8下显示的效果:

iOS8与iOS7图片异常及解释

好了,那么问题来了:为什么会造成在iOS7和iOS8下出现这种图片显示的差异呢?

答案来了:

我们取本地图片有两种方法

1、UIImage *image = [UIImage imageNamed:imageName];

2、NSString *path = [[NSBundle mainBundle]pathForResource:imageName];

   UIImage *image = [[UIImage alloc] initWithContentsOfFile:path];

先说说第一种方法。根据上面运行的差异,我们可以得到这样的结论,iOS8对后缀@2x或者@3x是敏感的,系统会根据设备而去使用染@2x还是@3x进行渲染。

而size都是取一倍的图片大小(视网膜效果)。而iOS7对文件后缀@2x或@3x是不敏感的,他直接取red@2x或@3x这个文件的size,使用red@2x或@3x的图片。

而iOS8会取red文件这个size,不过使用的图片是red@2x或@3x,因为要保证像素的效果。其实图片名后缀@2x或@3x是系统根据不同的设备去使用相应的图片(plus使用的是@3x)。

所以我们使用第一种方法(imageNamed:)去渲染图片是不应该加后缀@2x或@3x的,后缀是系统自己判断的使用的,我们写图片名只要写如red.png这样就行了,然后系统会根据不同设备

使用相应的图片。这样不管是对后缀敏感的iOS8还是不敏感的iOS7都能正确的得到相应的图片。再说说第二种方法,这种方法渲染图片是直接取图片文件的路径,如果方法后面写的图片文件

名是red.png的话就直接使用这张图片(指哪就用哪),如果没用red.png这个文件image就位nil了,而使用第一种方法image就不会。第二种方法一般用来渲染比较大的本地图片,一般尺寸

是固定的。