如果对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];
在iOS8下显示的效果:
好了,那么问题来了:为什么会造成在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就不会。第二种方法一般用来渲染比较大的本地图片,一般尺寸
是固定的。