可能的重复: 如何为iPhone 5屏幕分辨率开发或迁移应用程序?

我只是想知道我们应该如何应对iPhone 5更大的屏幕。

因为它在高度上有更多的像素,像GCRectMake这样使用坐标的东西(只是由于视网膜/非视网膜问题将像素增加了一倍)在版本之间无法无缝工作,就像我们得到视网膜时发生的那样。

我们是否需要设计两个故事板,就像iPad一样?

我个人不认为苹果会像许多人说的那样,要求你每次画画时都检查屏幕大小。iPad也会这样吗?


当前回答

你需要添加一个640x1136像素的PNG图像(Default-568h@2x.png)作为你的项目的4英寸默认splash图像,它将使用额外的空间(在简单的基于表格的应用程序上没有努力,游戏将需要更多的努力)。

为了处理所有屏幕分辨率,我创建了一个小的UIDevice类别。你可以在这里得到它,但代码如下:

文件UIDevice + Resolutions.h:

enum {
    UIDeviceResolution_Unknown           = 0,
    UIDeviceResolution_iPhoneStandard    = 1,    // iPhone 1,3,3GS Standard Display  (320x480px)
    UIDeviceResolution_iPhoneRetina4    = 2,    // iPhone 4,4S Retina Display 3.5"  (640x960px)
    UIDeviceResolution_iPhoneRetina5     = 3,    // iPhone 5 Retina Display 4"       (640x1136px)
    UIDeviceResolution_iPadStandard      = 4,    // iPad 1,2,mini Standard Display   (1024x768px)
    UIDeviceResolution_iPadRetina        = 5     // iPad 3 Retina Display            (2048x1536px)
}; typedef NSUInteger UIDeviceResolution;

@interface UIDevice (Resolutions)

- (UIDeviceResolution)resolution;

NSString *NSStringFromResolution(UIDeviceResolution resolution);

@end

文件UIDevice + Resolutions.m:

#import "UIDevice+Resolutions.h"

@implementation UIDevice (Resolutions)

- (UIDeviceResolution)resolution
{
    UIDeviceResolution resolution = UIDeviceResolution_Unknown;
    UIScreen *mainScreen = [UIScreen mainScreen];
    CGFloat scale = ([mainScreen respondsToSelector:@selector(scale)] ? mainScreen.scale : 1.0f);
    CGFloat pixelHeight = (CGRectGetHeight(mainScreen.bounds) * scale);

    if (UI_USER_INTERFACE_IDIOM() == UIUserInterfaceIdiomPhone){
        if (scale == 2.0f) {
            if (pixelHeight == 960.0f)
                resolution = UIDeviceResolution_iPhoneRetina4;
            else if (pixelHeight == 1136.0f)
                resolution = UIDeviceResolution_iPhoneRetina5;

        } else if (scale == 1.0f && pixelHeight == 480.0f)
            resolution = UIDeviceResolution_iPhoneStandard;

    } else {
        if (scale == 2.0f && pixelHeight == 2048.0f) {
            resolution = UIDeviceResolution_iPadRetina;

        } else if (scale == 1.0f && pixelHeight == 1024.0f) {
            resolution = UIDeviceResolution_iPadStandard;
        }
    }

    return resolution;
 }

 @end

这就是使用这段代码的方式。

1)添加上述UIDevice+Resolutions.h & UIDevice+Resolutions。M文件到您的项目

2)在ViewController.m中添加一行#import“UIDevice+ resolution .h”

3)添加此代码以检查您正在处理的设备的版本

int valueDevice = [[UIDevice currentDevice] resolution];

    NSLog(@"valueDevice: %d ...", valueDevice);

    if (valueDevice == 0)
    {
        //unknow device - you got me!
    }
    else if (valueDevice == 1)
    {
        //standard iphone 3GS and lower
    }
    else if (valueDevice == 2)
    {
        //iphone 4 & 4S
    }
    else if (valueDevice == 3)
    {
        //iphone 5
    }
    else if (valueDevice == 4)
    {
        //ipad 2
    }
    else if (valueDevice == 5)
    {
        //ipad 3 - retina display
    }

其他回答

从我今天的演讲中可以看出,所有的应用程序都将继续在垂直拉伸的屏幕上工作。它们会被用字母盒装起来,或者基本上额外的88点高度会被简单地用黑色表示。

如果你只打算支持iOS 6+,那么一定要考虑使用自动布局。它删除了所有固定的布局处理,而是使用约束来布局事物。没有什么是硬编码的,您的生活将变得简单得多。

然而,如果你必须支持旧的iOS,那就真的取决于你的应用程序了。大多数使用标准导航栏和/或标签栏的应用程序都可以简单地展开中间的内容来使用这些额外的点。设置中心内容的自动调整大小蒙版,使其向两个方向展开。

view.autoresizingMask = UIViewAutoresizingFlexibleWidth | UIViewAutoresizingFlexibleHeight;

对于表视图,它的开箱即用非常好,但是,如果你的应用程序使用像素完美的布局来显示内容,那么你最好的办法是重新想象内容,以便它可以适应不同的高度。

如果这是不可能的,那么唯一剩下的选择是拥有两个ui (pre - iPhone 5和iPhone 5)。

如果这听起来很难看,那么你可以使用默认的字母盒模型,其中额外的点/像素只显示为黑色。

Edit

为了让你的应用程序在iPhone 5上运行,你需要添加一个视网膜版本的启动器图像。它应该被命名为Default-568h@2x.png。而且它必须是视网膜质量-这里没有向后兼容性:)

你也可以在Xcode中选择这张图片。转到目标,在Summary部分下,寻找Launch Images。图像的大小必须是640x1136像素。如果有帮助的话,这是在哪里可以找到它的截图。

@Pascal对OP的问题的评论是正确的。通过简单地添加图像,它删除了黑色边框,应用程序将使用完整的高度。

您将需要通过确定设备正在使用更大的显示器来调整任何CGRects。例如,如果你需要一些与屏幕底部对齐的东西。

我相信有一个内置的方法,但我还没有看到任何东西,很多仍处于NDA之下,所以我们在应用程序中使用的方法是一个非常简单的全局函数。将以下内容添加到你的.pch文件中,然后它是一个简单的if(is4InchRetina()){…}调用来调整你的CGRects等。

static BOOL is4InchRetina()
{
    if (![UIApplication sharedApplication].statusBarHidden && (int)[[UIScreen mainScreen] applicationFrame].size.height == 548 || [UIApplication sharedApplication].statusBarHidden && (int)[[UIScreen mainScreen] applicationFrame].size.height == 568)
        return YES;

    return NO;
}

No.

if ([[UIScreen mainScreen] bounds].size.height > 960)

iPhone 5是错误的

if ([[UIScreen mainScreen] bounds].size.height == 568)

我认为你可以使用[UIScreen mainScreen].bounds.size。高度和计算台阶为您的对象。当你计算步长时,你可以为两个分辨率设置坐标。

或者你可以像上面一样高,如果(iphone5)那么…Else if(iphone4) then…else if (ipad)。就像这样。

如果你使用故事板,那么你必须为新iPhone创建新的。

你需要添加一个640x1136像素的PNG图像(Default-568h@2x.png)作为你的项目的4英寸默认splash图像,它将使用额外的空间(在简单的基于表格的应用程序上没有努力,游戏将需要更多的努力)。

为了处理所有屏幕分辨率,我创建了一个小的UIDevice类别。你可以在这里得到它,但代码如下:

文件UIDevice + Resolutions.h:

enum {
    UIDeviceResolution_Unknown           = 0,
    UIDeviceResolution_iPhoneStandard    = 1,    // iPhone 1,3,3GS Standard Display  (320x480px)
    UIDeviceResolution_iPhoneRetina4    = 2,    // iPhone 4,4S Retina Display 3.5"  (640x960px)
    UIDeviceResolution_iPhoneRetina5     = 3,    // iPhone 5 Retina Display 4"       (640x1136px)
    UIDeviceResolution_iPadStandard      = 4,    // iPad 1,2,mini Standard Display   (1024x768px)
    UIDeviceResolution_iPadRetina        = 5     // iPad 3 Retina Display            (2048x1536px)
}; typedef NSUInteger UIDeviceResolution;

@interface UIDevice (Resolutions)

- (UIDeviceResolution)resolution;

NSString *NSStringFromResolution(UIDeviceResolution resolution);

@end

文件UIDevice + Resolutions.m:

#import "UIDevice+Resolutions.h"

@implementation UIDevice (Resolutions)

- (UIDeviceResolution)resolution
{
    UIDeviceResolution resolution = UIDeviceResolution_Unknown;
    UIScreen *mainScreen = [UIScreen mainScreen];
    CGFloat scale = ([mainScreen respondsToSelector:@selector(scale)] ? mainScreen.scale : 1.0f);
    CGFloat pixelHeight = (CGRectGetHeight(mainScreen.bounds) * scale);

    if (UI_USER_INTERFACE_IDIOM() == UIUserInterfaceIdiomPhone){
        if (scale == 2.0f) {
            if (pixelHeight == 960.0f)
                resolution = UIDeviceResolution_iPhoneRetina4;
            else if (pixelHeight == 1136.0f)
                resolution = UIDeviceResolution_iPhoneRetina5;

        } else if (scale == 1.0f && pixelHeight == 480.0f)
            resolution = UIDeviceResolution_iPhoneStandard;

    } else {
        if (scale == 2.0f && pixelHeight == 2048.0f) {
            resolution = UIDeviceResolution_iPadRetina;

        } else if (scale == 1.0f && pixelHeight == 1024.0f) {
            resolution = UIDeviceResolution_iPadStandard;
        }
    }

    return resolution;
 }

 @end

这就是使用这段代码的方式。

1)添加上述UIDevice+Resolutions.h & UIDevice+Resolutions。M文件到您的项目

2)在ViewController.m中添加一行#import“UIDevice+ resolution .h”

3)添加此代码以检查您正在处理的设备的版本

int valueDevice = [[UIDevice currentDevice] resolution];

    NSLog(@"valueDevice: %d ...", valueDevice);

    if (valueDevice == 0)
    {
        //unknow device - you got me!
    }
    else if (valueDevice == 1)
    {
        //standard iphone 3GS and lower
    }
    else if (valueDevice == 2)
    {
        //iphone 4 & 4S
    }
    else if (valueDevice == 3)
    {
        //iphone 5
    }
    else if (valueDevice == 4)
    {
        //ipad 2
    }
    else if (valueDevice == 5)
    {
        //ipad 3 - retina display
    }