我正在尝试编写通用应用程序。对于不同的屏幕分辨率,显示应略有不同。但是当我这样编码时:
- (void)viewDidLoad {
SCREEN_WIDTH=[[UIScreen mainScreen] applicationFrame].size.width;
SCREEN_HEIGHT=[[UIScreen mainScreen] applicationFrame].size.height;
NSLog(@"w:%f h:%f",SCREEN_WIDTH,SCREEN_HEIGHT);
...
}
即使模拟器设置为
,我也会输出w:320.000000 h:480.000000
硬件 - >设备 - > iPhone(视网膜)
此外,具有此分辨率的图像在模拟器中显示为全屏图像
我明白我应该得到w:640.000000 h:960.000000
对其他人来说这样吗?任何想法为什么/如何解决?
请参阅相关主题:here
答案 0 :(得分:5)
UIScreen
将始终将Retina显示设备的分辨率报告为非Retina显示设备的分辨率。这允许旧代码在这样的屏幕上透明地运行。但是,UIScreen
会公开scale
属性,当与屏幕边界结合使用时,可用于确定设备的物理像素分辨率:
CGSize PhysicalPixelSizeOfScreen(UIScreen *s) {
CGSize result = s.bounds.size;
if ([s respondsToSelector: @selector(scale)]) {
CGFloat scale = s.scale;
result = CGSizeMake(result.width * scale, result.height * scale);
}
return result;
}
iPhone 4上的结果值为{ 640.0, 960.0 }
。
答案 1 :(得分:3)
这是我发现的。从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,它将在所有事情上表现得非常好。同样,如果您从一个漂亮的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);
}
答案 2 :(得分:1)
您是否将图片重命名为img.png@2x?您应该在代码中启用视网膜显示。
即使您将模拟器设置为视网膜显示器,但代码未启用视网膜显示,显示的图形将为320x480。