iOS 6应用程序-如何处理iPhone 5的屏幕大小?

iOS 6应用程序-如何处理iPhone 5的屏幕大小?,iphone,ios,iphone-5,Iphone,Ios,Iphone 5,可能重复: 我只是想知道我们应该如何应对iPhone 5更大的屏幕尺寸 由于它的高度有更多的像素,像GCRectMake这样使用坐标的东西,只是因为视网膜/非视网膜问题而将像素增加了一倍,在不同版本之间无法无缝工作,就像我们得到 我们会像iPad一样设计两个故事板吗 我个人认为,苹果不会像许多答案所说的那样,每次你必须画东西时都要求你检查屏幕大小。iPad会发生这种情况吗 我认为您可以使用[UIScreen mainScreen].bounds.size.height并计算对象的步长。计算步长

可能重复:

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


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

我们会像iPad一样设计两个故事板吗

我个人认为,苹果不会像许多答案所说的那样,每次你必须画东西时都要求你检查屏幕大小。iPad会发生这种情况吗

我认为您可以使用[UIScreen mainScreen].bounds.size.height并计算对象的步长。计算步长时,可以设置两种分辨率的坐标

或者你可以得到上面的高度,然后。。。否则我会打电话给你。。。否则,我就走了。像这样的

如果您使用情节串连板,那么您必须为新iPhone创建新的情节串连板。

我认为您可以使用[UIScreen mainScreen].bounds.size.height并计算对象的步长。计算步长时,可以设置两种分辨率的坐标

或者你可以得到上面的高度,然后。。。否则我会打电话给你。。。否则,我就走了。像这样的

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


由于它有更多的高度像素,像GCRectMake这样使用坐标的东西在不同版本之间无法无缝工作,就像我们得到视网膜时发生的那样

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

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


由于它有更多的高度像素,像GCRectMake这样使用坐标的东西在不同版本之间无法无缝工作,就像我们得到视网膜时发生的那样

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


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

从今天的演示中我可以看出,所有应用程序都将继续在垂直拉伸的屏幕上工作。他们将被字母框或基本上额外的88点的高度将是简单的黑色

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

但是,如果您必须支持较旧的iOS,那么这实际上取决于您的应用程序。使用标准导航栏和/或标签栏的大多数应用程序可以简单地在中间扩展内容以使用额外的点。将中心内容的自动调整大小遮罩设置为在两个方向上展开

view.autoresizingMask = UIViewAutoresizingFlexibleWidth | UIViewAutoresizingFlexibleHeight;
对于表格视图来说,它的开箱即用效果非常好,但是,如果你的应用程序使用像素完美的布局来显示内容,那么你最好的选择就是重新想象内容,使其能够适应不同的高度

如果不可能,那么剩下的唯一选择就是在iPhone5和iPhone5之前安装两个UI

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

编辑

要使您的应用程序与iPhone5配合使用,您需要添加launcher图像的视网膜版本。它应该被命名为Default-568h@2x.png. 它必须是视网膜质量-这里没有向后兼容性:

您还可以从Xcode中选择此图像。转到目标,在摘要部分下,查找启动图像。图像的大小必须为640x1136像素。如果有帮助的话,这里有一个在哪里找到它的截图


从我今天的演示中可以看出,所有应用程序都将继续在垂直延伸的屏幕上工作。他们将被字母框或基本上额外的88点的高度将是简单的黑色

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

但是,如果您必须支持较旧的iOS,那么这实际上取决于您的应用程序。大多数使用标准导航栏的应用程序, 和/或标签栏,可以简单地在中间扩展内容以使用额外的点。将中心内容的自动调整大小遮罩设置为在两个方向上展开

view.autoresizingMask = UIViewAutoresizingFlexibleWidth | UIViewAutoresizingFlexibleHeight;
对于表格视图来说,它的开箱即用效果非常好,但是,如果你的应用程序使用像素完美的布局来显示内容,那么你最好的选择就是重新想象内容,使其能够适应不同的高度

如果不可能,那么剩下的唯一选择就是在iPhone5和iPhone5之前安装两个UI

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

编辑

要使您的应用程序与iPhone5配合使用,您需要添加launcher图像的视网膜版本。它应该被命名为Default-568h@2x.png. 它必须是视网膜质量-这里没有向后兼容性:

您还可以从Xcode中选择此图像。转到目标,在摘要部分下,查找启动图像。图像的大小必须为640x1136像素。如果有帮助的话,这里有一个在哪里找到它的截图


我刚刚完成更新,并将我的一个应用程序的iOS 6.0版本发送到商店。这个版本向后兼容iOS5.0,因此我保留了shouldAutorotateToInterfaceOrientation:方法,并添加了如下所示的新方法

我必须做到以下几点:

iOS 6中的自动旋转正在改变。在iOS 6中,不推荐使用UIViewController的shouldAutorotateToInterfaceOrientation:方法。取而代之的是,您应该使用supportedInterfaceOrientionsforWindow:和shouldAutorotate方法。 因此,我添加了这些新方法,并保留了与iOS 5兼容的旧方法:

- (BOOL)shouldAutorotate {
    return YES;
}

- (NSUInteger)supportedInterfaceOrientations {
    return UIInterfaceOrientationMaskAllButUpsideDown;    
}
使用视图控制器的viewWillLayoutSubviews方法,并使用视图的边框调整布局。 模态视图控制器:willRotateToInterfaceOrientation:持续时间:, WillAnimateRotationInterfaceOrientation:持续时间:,和 didRotateFromInterfaceOrientation:不再调用方法 在屏幕上进行全屏演示的任何视图控制器 自身,例如presentViewController:animated:completion:。 然后我修复了需要自动布局的视图。 将启动视图模拟器和iTunes商店视图中的图像复制到PhotoShop中,并将其导出为png文件。 默认图像的名称为:default-568h@2x.png尺寸为640×1136。它还允许为移除的相同纵向模式状态栏提供640×1096。如果您的应用程序在iPhone上只允许横向定位,则在横向模式下也可以提供类似的尺寸。 我已经放弃了iOS 4的向后兼容性。这样做的主要原因是对armv6代码的支持已经取消。因此,我现在能够支持的所有运行armv7的设备都可以升级到iOS 5。 我也正在生成支持iPhone5的armv7s代码,因此可以 不使用任何第三方框架作为Admob等,除非 更新。
这是所有,但只记得测试自动旋转在iOS 5和iOS 6,因为在旋转的变化。

我刚刚完成更新和发送iOS 6.0版本的我的一个应用程序到商店。这个版本向后兼容iOS5.0,因此我保留了shouldAutorotateToInterfaceOrientation:方法,并添加了如下所示的新方法

我必须做到以下几点:

iOS 6中的自动旋转正在改变。在iOS 6中,不推荐使用UIViewController的shouldAutorotateToInterfaceOrientation:方法。取而代之的是,您应该使用supportedInterfaceOrientionsforWindow:和shouldAutorotate方法。 因此,我添加了这些新方法,并保留了与iOS 5兼容的旧方法:

- (BOOL)shouldAutorotate {
    return YES;
}

- (NSUInteger)supportedInterfaceOrientations {
    return UIInterfaceOrientationMaskAllButUpsideDown;    
}
使用视图控制器的viewWillLayoutSubviews方法,并使用视图的边框调整布局。 模态视图控制器:willRotateToInterfaceOrientation:持续时间:, WillAnimateRotationInterfaceOrientation:持续时间:,和 didRotateFromInterfaceOrientation:不再调用方法 在屏幕上进行全屏演示的任何视图控制器 自身,例如presentViewController:animated:completion:。 然后我修复了需要自动布局的视图。 将启动视图模拟器和iTunes商店视图中的图像复制到PhotoShop中,并将其导出为png文件。 默认图像的名称为:default-568h@2x.png尺寸为640×1136。它还允许为移除的相同纵向模式状态栏提供640×1096。如果您的应用程序在iPhone上只允许横向定位,则在横向模式下也可以提供类似的尺寸。 我已经放弃了iOS 4的向后兼容性。这样做的主要原因是对armv6代码的支持已经取消。因此,我现在能够支持的所有运行armv7的设备都可以升级到iOS 5。 我也正在生成支持iPhone5的armv7s代码,因此可以 不使用任何第三方框架作为Admob等,除非 更新。 这就是我要记住的
由于旋转的变化,在iOS 5和iOS 6中测试自动旋转。

您需要添加640x1136像素的默认图像-568h@2x.png作为项目的4英寸默认启动图像,它将使用额外的空间,而不需要在简单的基于表的应用程序上进行操作,因此游戏需要更多的操作

为了处理所有屏幕分辨率,我创建了一个小的UIDevice类别。可以,但代码如下所示:

文件UIDevice+Resolutions.h: 文件UIDevice+Resolutions.m: 这就是您需要如何使用此代码

1将上述UIDevice+Resolutions.h&UIDevice+Resolutions.m文件添加到项目中

2将行import UIDevice+Resolutions.h添加到ViewController.m

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
    }

您需要添加640x1136像素的默认图像-568h@2x.png作为项目的4英寸默认启动图像,它将使用额外的空间,而不需要在简单的基于表的应用程序上进行操作,因此游戏需要更多的操作

为了处理所有屏幕分辨率,我创建了一个小的UIDevice类别。可以,但代码如下所示:

文件UIDevice+Resolutions.h: 文件UIDevice+Resolutions.m: 这就是您需要如何使用此代码

1将上述UIDevice+Resolutions.h&UIDevice+Resolutions.m文件添加到项目中

2将行import UIDevice+Resolutions.h添加到ViewController.m

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
    }
这样,无论屏幕大小如何,如果您想检测它是否只是iPhone或iPad,您只需使用:

if ([UIDevice deviceType] & iPhone) 

如果您只想检测iPhone5,可以使用

if ([UIDevice deviceType] & iPhone5)
与Malcom的回答相反,你需要检查一下它是否是iPhone

if ([UIDevice currentResolution] == UIDevice_iPhoneHiRes || 
    [UIDevice currentResolution] == UIDevice_iPhoneStandardRes || 
    [UIDevice currentResolution] == UIDevice_iPhoneTallerHiRes)`
这两种方式都没有彼此的优势,这只是个人的偏好

这样,无论屏幕大小如何,如果您想检测它是否只是iPhone或iPad,您只需使用:

if ([UIDevice deviceType] & iPhone) 

如果您只想检测iPhone5,可以使用

if ([UIDevice deviceType] & iPhone5)
与Malcom的回答相反,你需要检查一下它是否是iPhone

if ([UIDevice currentResolution] == UIDevice_iPhoneHiRes || 
    [UIDevice currentResolution] == UIDevice_iPhoneStandardRes || 
    [UIDevice currentResolution] == UIDevice_iPhoneTallerHiRes)`
这两种方式都没有明显的优势,这只是个人的喜好。

没有

if ([[UIScreen mainScreen] bounds].size.height > 960)
在iphone5上是错误的

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

在iphone5上是错误的

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

@帕斯卡对OP问题的评论是正确的。通过简单地添加图像,它会删除黑色边框,应用程序将使用全高

您需要通过确定设备正在使用更大的显示器来调整任何CGRECT。例如,如果您需要与屏幕底部对齐的内容

我相信有一个内置的方法,但我没有看到任何东西,很多仍然在保密协议下,所以我们在我们的应用程序中使用的方法是非常简单的一个全局函数。将以下内容添加到.pch文件中,然后使用一个简单的if is4inchrati{…}调用来调整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;
}

@帕斯卡对OP问题的评论是正确的。通过简单地添加图像,它会删除黑色边框,应用程序将使用全高

您需要通过确定设备正在使用更大的显示器来调整任何CGRECT。例如,如果您需要与屏幕底部对齐的内容

我相信有一个内置的方法,但我没有看到任何东西,很多仍然在保密协议下,所以我们在我们的应用程序中使用的方法是非常简单的一个全局函数。将以下内容添加到.pch文件中,然后使用一个简单的if is4inchrati{…}调用来调整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;
}

就像我们得到视网膜时发生的那样。->我知道它们在视网膜/非视网膜之间起作用,如果我不清楚,很抱歉。我是说这种无缝转换在iPhone5中不起作用。你不认为苹果会比通过编程检查屏幕尺寸更容易吗?是的,罗伯特!好吧,像这样的事情一直有效到现在…@JúlioTurollaRibeiro?你的意思是苹果用水晶球创造了一些工具来改变充满魔法常数的代码,这只是巧合而已=直到今天屏幕尺寸还是一样?@RobertVojta CGRectMake0,0320480;视网膜显示器的工作原理和非视网膜显示器的工作原理一样。就像我们得到视网膜时一样。->我知道它们在视网膜/非视网膜之间起作用,如果我不清楚,很抱歉。我是说这种无缝转换在iPhone5中不起作用。你不认为苹果会比通过编程检查屏幕尺寸更容易吗?是的,罗伯特!好吧,像这样的事情一直有效到现在…@JúlioTurollaRibeiro?你的意思是苹果用水晶球创造了一些工具来改变充满魔法常数的代码,这只是巧合而已=直到今天屏幕尺寸还是一样?@RobertVojta CGRectMake0,0320480;对视网膜显示器的工作原理和对非视网膜显示器的工作原理一样。这是有道理的,但正如我上面所说的,你不认为苹果会创造奇迹吗


有更简单的吗?嗯,我不知道。这与iPhone和iPhone视网膜不同。这个屏幕的高度有更多的像素,所以比例不一样。如果我记得旧的应用程序是居中的,上面和下面都有黑色的带子的话,我会在keynote上展示。@JúlioTurollaRibeiro你认为苹果会创造更简单的东西吗?这是一个主观的问题。如果信息不存在,没有人能为你回答。因此,这不是一个建设性的问题。我想他们通过引入新的相对布局系统使事情变得更容易了,不幸的是,如果你想支持摘要页面上选择了旋转吗?我的应用程序已经有了一个可调整大小的视图,但仍然在信箱中启动。即使我将我的视图宽度改为568,它仍然启动了letterboxed和squished,以启动!一旦我添加了默认值-568h@2x.png,它以适当的纵横比启动。如果您希望同时支持iOS 5自动旋转和iOS 6自动旋转,是否在同一文件中包括旧自动旋转方法之外的新方法?andrewx,是的。您既支持以前方法中的旧休假,也支持上面添加的新休假。然后,当运行iOS 5时,它会调用旧的,iOS 6会调用新的。嘿,伙计们!我已经为自动旋转添加了两种方法,但是没有自动旋转发生。当我倾斜设备时,屏幕仍为纵向。。。这里有什么问题?您是否在目标->摘要页面上选择了旋转?这对我根本不起作用,可能我遗漏了一些东西,但是如果[UIDevice deviceType]&iPhone5在任何设备上对我返回true,无论屏幕大小如何?对此表示抱歉。我做了一些改变。如果是retinia ipod,它将返回iPhoneRetina。如果它是一个高大的ipod,它将返回iPhone5。如果是低分辨率的iphone,它将返回iphone。这对我来说根本不起作用,也许我遗漏了一些东西,但是如果[UIDevice deviceType]&iPhone5在任何设备上对我返回true,无论屏幕大小如何?很抱歉。我做了一些改变。如果是retinia ipod,它将返回iPhoneRetina。如果它是一个高大的ipod,它将返回iPhone5。如果是低分辨率的iphone,它将返回iphone。只有几点建议:1在报告iPhoneAllerHires之前,您可能需要实际测试高度==568*2,2您可能还需要测试宽度。然后,对于所有未明确识别的内容,返回UIDevice\u notRecognizedRes。如果未来的iPhone>5或新款iPad的屏幕尺寸为另一个.ps,应该更容易适应。进一步考虑这种逻辑,您可能还希望显式地检查UIUserInterfaceIdiomPad,而不是假设!phone==pad。批准了Evan Schoenberg的编辑请求,以修复iOS 4及更高版本标准分辨率iPhone的行为。已编辑的代码位于malcommac的git存储库中:将上下文移动到注释中,而不是

问题的主体在使用苹果公司已知的类前缀时非常小心。@FatihArslan-这不是你使用这个函数的方式。这是不正确的[UIDevice currentResolution]==UIDevice\U iPhoneAllerHires有谁能告诉我如何正确使用此功能吗???只有一些建议:1在报告iPhoneAllerHires之前,您可能需要实际测试高度==568*2,2您可能还需要测试宽度。然后,对于所有未明确识别的内容,返回UIDevice\u notRecognizedRes。如果未来的iPhone>5或新款iPad的屏幕尺寸为另一个.ps,应该更容易适应。进一步考虑这种逻辑,您可能还希望显式地检查UIUserInterfaceIdiomPad,而不是假设!phone==pad。批准了Evan Schoenberg的编辑请求,以修复iOS 4及更高版本标准分辨率iPhone的行为。已编辑的代码位于malcommac的git存储库中:使用Apple已知的类前缀将上下文移动到注释中,而不是问题正文中。@FatihArslan-这不是使用此函数的方式。这是不正确的[UIDevice currentResolution]==UIDevice\U iPhoneAllerHires有人能告诉我如何正确使用此功能吗???为什么568??请给我解释一下。感谢iPhone 5的屏幕分辨率为1136x640;不过,所有尺寸均采用2像素单位,以与原始iPhone屏幕保持一致——苹果将iPhone4中每个方向的像素数增加了一倍,但希望所有软件都能不受影响地运行。所以568是新屏幕的高度=1136/2。谢谢我在我的屏幕上做了更改。我喜欢这种方法,因为它是一行,硬编码的568符合苹果对特定设备发布图像的命名约定。例如默认值-568h@2x.png. .为什么是568??请给我解释一下。感谢iPhone 5的屏幕分辨率为1136x640;不过,所有尺寸均采用2像素单位,以与原始iPhone屏幕保持一致——苹果将iPhone4中每个方向的像素数增加了一倍,但希望所有软件都能不受影响地运行。所以568是新屏幕的高度=1136/2。谢谢我在我的屏幕上做了更改。我喜欢这种方法,因为它是一行,硬编码的568符合苹果对特定设备发布图像的命名约定。例如默认值-568h@2x.png. .未经测试,但当iPhone有两倍大小的状态栏时,可能会有一个bug。例如,在电话通话中。未经测试,但当iPhone有两倍大小的状态栏时,可能会出现错误。例如,在电话通话中。我认为UIActionSheet在iOS6中在不高的iPhone上被破坏了,如果你使用这种方法,并且不做任何特别的事情来修复操作表。如果我将主笔尖设置为高,这是唯一被破坏的部分。xcode会自动将图像重命名为默认值-568h@2x.png所以你不必自己这样命名。只需在photoshop 640x1136上制作一个图像,并将其拖放到项目中的指定区域。@DaGaMs或者您可以添加self.window.frame=[UIScreen mainScreen].bounds;在您的应用程序顶部:didFinishLaunchingWithOptions:。此外,如果视图包含子视图,则视图的AutoResizesSubView也需要设置为YES。我认为UIActionSheet在非高型iPhone上的iOS6中被破坏,如果您使用此方法,并且不做任何特殊的操作来修复操作表。如果我将主笔尖设置为高,这是唯一被破坏的部分。xcode会自动将图像重命名为默认值-568h@2x.png所以你不必自己这样命名。只需在photoshop 640x1136上制作一个图像,并将其拖放到项目中的指定区域。@DaGaMs或者您可以添加self.window.frame=[UIScreen mainScreen].bounds;在-应用程序顶部:didFinishLaunchingWithOptions:。此外,如果视图包含子视图,则视图的AutoResizesPubViews也需要设置为“是”。