这是我找到的资料。自从iOS4以来,
[[UIScreen mainScreen] applicationFrame].size.width;
和
[[UIScreen mainScreen] applicationFrame].size.height;
给出的是“点”的尺寸,而不是“像素”。对于其他所有内容,像素=点,但对于iPhone4来说,每个点有4个像素。普通图像在iPhone4上被缩放,因此图像中的每个像素都被映射到一个点上。这意味着iPhone4可以运行iPhone应用程序而不会有明显的变化。
添加利用iPhone更高分辨率的“高分辨率”图像的“苹果”方式是将“.png”替换为“@2x.png”作为图像文件名,并在图像中加倍像素密度(实际上只是宽度和高度)。重要的是,不要改变代码中引用图像的方式。
因此,如果你的代码中有“img.png”,如果可用,iPhone4将加载“img@2x.png”图像。
这样做的问题是,如果你想开发一个通用应用程序,并包含所有可能的屏幕分辨率/像素密度的单独图像,你的应用程序很快就会变得臃肿。
解决这个问题的常见方法是从网络上获取所有所需的图像。这将使你的二进制文件变得更小。但负面影响是会消耗你用户的网络流量,并且如果你的应用程序没有其他使用网络的原因(并且你没有在应用商店描述中说明你的应用程序需要网络),这将真正地惹恼用户。
幸运的是,我找到了另一种方法。通常情况下,当你缩放一个图像时,iPhone4会聪明地利用缩放后图像的增加像素密度。例如,你可能有:
UIButton *myButton = [[UIButton alloc] initWithFrame:CGRectMake(0, 0, 100.0, 50.0)];
[indicatorButton setBackgroundImage:
[UIImage imageNamed:@"buttonImage.png"] forState:UIControlStateNormal];
现在,如果buttonImage.png的大小是200x100,它将在所有设备上都表现得很好。同样地,如果您使用类似以下内容的方法,从一个漂亮的640x960像素的图像开始,在iPad上显示得非常好,并将其缩小到320x480像素的图像以适应较小的屏幕:
+ (UIImage*)imageWithImage:(UIImage*)image newX:(float)newX newY:(float)newY{
CGSize newSize=CGSizeMake((CGFloat)newX, (CGFloat)newY);
UIGraphicsBeginImageContext(newSize);
[image drawInRect:CGRectMake(0,0,newX,newY)];
UIImage* newImage = UIGraphicsGetImageFromCurrentImageContext();
UIGraphicsEndImageContext();
return newImage;
}
它应该在iPhone4上显示得很好。关键是不要重复缩放。例如,如果您做了这样的事情:
UIButton *myButton = [[UIButton alloc] initWithFrame:CGRectMake(0, 0, 100.0, 50.0)];
[indicatorButton setBackgroundImage:
[Utilities imageWithImage:[UIImage imageNamed:@"buttonImage.png"] newX:100 newY:50] forState:UIControlStateNormal];
如果你不按照上述方法处理图片,那么你的像素密度就会丢失,导致在iPhone4上显示的图像会变得模糊。
最后,如果你想检测是否为iPhone4(如果使用上述技术则并不是必需的),以下代码可能会有用:
+(bool)imAnIphone4{
return([[UIScreen mainScreen]respondsToSelector:@selector(scale)] && [UIScreen mainScreen].scale==2);
}