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

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

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

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

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


当前回答

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

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

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

其他回答

@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;
}

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

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

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

由于它在高度上有更多的像素,像GCRectMake这样使用坐标的东西在版本之间无法无缝工作,就像我们获得Retina时发生的那样。

好吧,它们的工作原理与视网膜显示器相同——只是CoreGraphics坐标系统中的1个单位将对应2个物理像素,但你不需要/不必做任何事情,逻辑保持不变。(你有没有试过在视网膜iPhone上运行你的非视网膜应用程序?)

对于实际的问题:这就是为什么你不应该使用显式的CGRectMakes和co…这就是为什么你有[[UIScreen mainScreen] applicationFrame]这样的东西。

@interface UIDevice (Screen)
typedef enum
{
    iPhone          = 1 << 1,
    iPhoneRetina    = 1 << 2,
    iPhone5         = 1 << 3,
    iPad            = 1 << 4,
    iPadRetina      = 1 << 5

} DeviceType;

+ (DeviceType)deviceType;
@end

.m

#import "UIDevice+Screen.h"
@implementation UIDevice (Screen)

+ (DeviceType)deviceType
{
    DeviceType thisDevice = 0;
    if ([[UIDevice currentDevice] userInterfaceIdiom] == UIUserInterfaceIdiomPhone)
    {
        thisDevice |= iPhone;
        if ([[UIScreen mainScreen] respondsToSelector: @selector(scale)])
        {
            thisDevice |= iPhoneRetina;
            if ([[UIScreen mainScreen] bounds].size.height == 568)
                thisDevice |= iPhone5;
        }
    }
    else
    {
        thisDevice |= iPad;
        if ([[UIScreen mainScreen] respondsToSelector: @selector(scale)])
            thisDevice |= iPadRetina;
    }
    return thisDevice;
}

@end

这样,如果你想检测它是iPhone还是iPad(不管屏幕大小),你只需要使用:

if ([UIDevice deviceType] & iPhone) 

or

if ([UIDevice deviceType] & iPad)

如果你只想检测iPhone 5,你可以使用

if ([UIDevice deviceType] & iPhone5)

与马尔科姆的答案相反,你需要检查才能确定它是否是iPhone,

if ([UIDevice currentResolution] == UIDevice_iPhoneHiRes || 
    [UIDevice currentResolution] == UIDevice_iPhoneStandardRes || 
    [UIDevice currentResolution] == UIDevice_iPhoneTallerHiRes)`

这两种方式都没有太大的优势,这只是个人喜好。

No.

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

iPhone 5是错误的

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