如果不是通过 imageNamed 加载的,@2x 图像将始终是非视网膜图像尺寸的两倍。
在视网膜和非视网膜设备上创建这样的图像:
UIImage *anImage = [UIImage imageNamed: @"anImageName"];
NSLog(@"%@: scale: %f", NSStringFromCGSize(anImage.size), anImage.scale);
打印在视网膜设备上的 CGSize 对象将与非视网膜图像的大小相同,但比例设置为 2.0。
使用显式视网膜后缀创建图像将显示图像实际上是两倍大 - 因此 imageNamed 会进行自己的图像缩放。
如果您想在已经创建并调整大小的图像视图中显示它,您仍然不需要做任何事情 - 只需直接加载它,图像视图就会将图像调整为正确的大小。
然而,如果你想创建一个新的图像视图,那么你需要创建一个框架来关注 UIScreen 的分辨率,就像这样(不幸的是,你不能只将 scale 属性设置为只读):
CGRect newFrame = CGRectZero;
newFrame.size.width = (anImage.size.width / [UIScreen mainScreen].scale);
newFrame.size.height = (anImage.size.height / [UIScreen mainScreen].scale);
这假设您的网络服务知道设备的屏幕是否是视网膜;有些服务会自动接收,有些会要求您提前告诉他们。YMMV。