这是我发现的。从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”图像(如果可用)。
这样做的问题是,如果您正在尝试开发通用应用程序,并为所有不同的可能屏幕分辨率/像素密度包含单独的图像,您的应用程序将很快变得臃肿。
这个问题的一个常见解决方案是拉取所有需要的 'net. 这将使您的二进制文件变得又小又好。不利的一面是,这会占用您用户的互联网配额,并且确实会惹恼没有 wifi 的用户——尤其是如果您的应用没有其他理由使用“网络”(而且您没有说您的应用需要在您的应用商店描述中添加“网络”)。
幸运的是,我找到了另一种方法。通常,当您缩小图像时,iPhone4 足够聪明,可以利用缩放图像增加的像素密度。例如,您可能有:
UIButton *myButton = [[UIButton alloc] initWithFrame:CGRectMake(0, 0, 100.0, 50.0)];
[indicatorButton setBackgroundImage:
[UIImage imageNamed:@"buttonImage.png"] forState:UIControlStateNormal];
现在,如果 buttonImage.png 为 200x100,那么它在所有内容上的表现都会非常好。类似地,如果您从一个在 iPad 上显示得非常好的 640x960(像素)图像开始,然后将其缩小到 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);
}