可能的重复: 如何为iPhone 5屏幕分辨率开发或迁移应用程序?
我只是想知道我们应该如何应对iPhone 5更大的屏幕。
因为它在高度上有更多的像素,像GCRectMake这样使用坐标的东西(只是由于视网膜/非视网膜问题将像素增加了一倍)在版本之间无法无缝工作,就像我们得到视网膜时发生的那样。
我们是否需要设计两个故事板,就像iPad一样?
我个人不认为苹果会像许多人说的那样,要求你每次画画时都检查屏幕大小。iPad也会这样吗?
可能的重复: 如何为iPhone 5屏幕分辨率开发或迁移应用程序?
我只是想知道我们应该如何应对iPhone 5更大的屏幕。
因为它在高度上有更多的像素,像GCRectMake这样使用坐标的东西(只是由于视网膜/非视网膜问题将像素增加了一倍)在版本之间无法无缝工作,就像我们得到视网膜时发生的那样。
我们是否需要设计两个故事板,就像iPad一样?
我个人不认为苹果会像许多人说的那样,要求你每次画画时都检查屏幕大小。iPad也会这样吗?
当前回答
由于它在高度上有更多的像素,像GCRectMake这样使用坐标的东西在版本之间无法无缝工作,就像我们获得Retina时发生的那样。
好吧,它们的工作原理与视网膜显示器相同——只是CoreGraphics坐标系统中的1个单位将对应2个物理像素,但你不需要/不必做任何事情,逻辑保持不变。(你有没有试过在视网膜iPhone上运行你的非视网膜应用程序?)
对于实际的问题:这就是为什么你不应该使用显式的CGRectMakes和co…这就是为什么你有[[UIScreen mainScreen] applicationFrame]这样的东西。
其他回答
我认为你可以使用[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
}
@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)`
这两种方式都没有太大的优势,这只是个人喜好。
由于它在高度上有更多的像素,像GCRectMake这样使用坐标的东西在版本之间无法无缝工作,就像我们获得Retina时发生的那样。
好吧,它们的工作原理与视网膜显示器相同——只是CoreGraphics坐标系统中的1个单位将对应2个物理像素,但你不需要/不必做任何事情,逻辑保持不变。(你有没有试过在视网膜iPhone上运行你的非视网膜应用程序?)
对于实际的问题:这就是为什么你不应该使用显式的CGRectMakes和co…这就是为什么你有[[UIScreen mainScreen] applicationFrame]这样的东西。
@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;
}