19

iPhone 5 发布,具有新的屏幕尺寸和分辨率。

当我们使用 iPhone 4 (retina) 的图像时,我们只是在图像名称中添加了“@2x”。谁能告诉我,是否可以为新的 iPhone 屏幕添加不同的图像(背景、按钮等)?

第二个问题:我可以在我的应用程序中拥有单独的 XIB 文件:旧 iPhone、新 iPhone(如 iPhone 和 iPad)?

谢谢!

4

5 回答 5

50

这是我的博客中关于这个主题的一个例外:

[UIImage imageNamed:] 在 Retina 设备上运行时会自动加载 @2x 版本的图像。不幸的是,imageNamed: 在 iPhone 5 上运行时不会自动加载 -568h@2x 版本的图像。

有时这并不重要,例如图标和非全屏图形在 iPhone 4 和 5 上可能相同。但是,如果您有全屏背景图像,或工具栏等的全宽/全高背景图像,您将有问题。您的 480 高图像很可能会被拉伸(结果可能看起来很可怕)。

您可以手动检查屏幕尺寸并加载正确的图像,如下所示:

UIImage* myImage;
CGFloat screenHeight = [UIScreen mainScreen].bounds.size.height;
if ([UIScreen mainScreen].scale == 2.f && screenHeight == 568.0f) {
   myImage = [UIImage imageNamed:@"myImage-568h.png"];
} else {
   myImage = [UIImage imageNamed:@"myImage.png"];
}

有一种改变 UIImage imageNamed 的方法,它自动加载正确的图像。有关详细信息,请参阅下面的链接。

更多信息:http: //pervasivecode.blogspot.co.uk/2012/09/making-apps-work-on-iphone-5-screen-size.html

编辑:@Sound Blaster 和@GrizzlyNetch对的,在代码中你应该使用 imageNamed:@"myImage-568h.png"] 但实际文件名应该是 myImage-568h@2x.png。如果你不这样做,那么规模是不正确的,就像他们说的那样。

于 2012-09-21T14:28:33.407 回答
11

iPhone 5 没有引入新的像素密度,因此您可以使用之前使用的所有视网膜图像。

支持 iPhone 5 的新分辨率所需要做的就是让您的浏览量大增。对于大多数视图,如 tableview 和 scrollview,这不会出现任何问题。

也不需要为新分辨率添加额外的 XIB 文件,这也是不支持的。

只需将应用程序包添加Default-568h@2x.png到您的应用程序包中,即可让 iOS 6 让您的应用程序占用 iPhone 5 中可用的额外空间。

所有原生控件,例如标签栏,都会像您期望的那样运行。

如果您想在您的应用程序中支持 iOS4.3 和 5.*,请确保Use Autolayout关闭 nib 设置(界面生成器中的第一个选项卡)中的 。

然后确保正确设置视图autoresizingMask

于 2012-09-21T14:25:11.323 回答
1

if ([UIScreen mainScreen].scale == 2.f && screenHeight == 568.0f) 浮点数的精确比较在任何语言中都不是一个好主意,因为它们存储在内存中的方式存在舍入错误。例如,您不能保证 568.0f 不存储为 567.9999999 或 568.0000001。使用范围要安全得多,或者在这种情况下,screenHeight > 567.1f 就足够了。我怀疑即使是 iPhone 在物理上也不支持小部分像素。

于 2013-01-18T08:06:53.560 回答
1

编辑

请注意,从 iOS8 UIScreen 开始考虑方向(检查高度可以返回两个值,纵向高度或横向高度,之前它只是纵向高度),但 xcassets 更好,您可以在这里查看: How to addapt iphone背景?

结束编辑

根据本克莱顿的回答,我制作了一个方便的类别来管理 iPhone 5 的图像。谢谢。

+ (UIImage *) imageForName:(NSString *)imageName
{
    NSString *result = imageName;

    CGFloat screenHeight = [UIScreen mainScreen].bounds.size.height;
    BOOL isIphoneFive = ([UIScreen mainScreen].scale == 2.f && screenHeight == 568.0f);

    if (isIphoneFive)
    {
        NSString *imageNameWithoutExtension = [imageName stringByDeletingPathExtension];
        NSString *extension = [imageName pathExtension];

        result = [NSString stringWithFormat:@"%@-568h.%@",imageNameWithoutExtension, extension];
    }

    return [UIImage imageNamed:result];
}
于 2014-04-15T19:34:26.917 回答
0

我目前正在以这种方式检测当前设备是否是 4" iPhone,并且效果很好。hth

- (BOOL)isiPhone5{
    return ([[UIDevice currentDevice] userInterfaceIdiom] == UIUserInterfaceIdiomPhone && [UIScreen mainScreen].bounds.size.height == 568.0);
}
于 2013-02-11T22:47:01.700 回答