3

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

- (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即使模拟器设置为
Hardware->Device->iPhone (Retina)
此外,具有此分辨率的图像在模拟器中显示为全屏图像。
我知道我应该得到w:640.000000 h:960.000000.
其他人也这样吗?以及为什么/如何解决的任何想法?查看相关线程:这里

4

3 回答 3

5

UIScreen将始终将 Retina Display 设备的分辨率报告为非 Retina Display 设备的分辨率。这允许旧代码在此类屏幕上透明地运行。但是,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 }.

于 2011-01-23T09:26:36.743 回答
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,那么它在所有内容上的表现都会非常好。类似地,如果您从一个在 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);
}
于 2011-01-23T11:26:57.883 回答
1

您是否将图像重命名为 img.png@2x?你应该在你的代码中启用视网膜显示。

即使您将模拟器设置为视网膜显示但代码未启用视网膜显示,显示出来的图形也将是 320x480。

于 2011-01-23T09:02:14.277 回答