模拟器iPhone Retina有错误的屏幕分辨率

时间:2011-01-23 06:44:02

标签: ios-simulator screen retina-display universal

我正在尝试编写通用应用程序。对于不同的屏幕分辨率,显示应略有不同。但是当我这样编码时:

- (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

3 个答案:

答案 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。