可能重复:
How to develop or migrate apps for iPhone 5 screen resolution?
我只是想知道我们应该如何处理iPhone 5更大的屏幕尺寸。
由于它有更多像素的高度,像GCRectMake这样使用坐标(并且只是将像素与视网膜/非视网膜问题加倍)之类的东西将无法在版本之间无缝地工作,就像我们得到{{3}时发生的那样}。
我们是否必须设计两个故事板,就像iPad一样?
我个人认为Apple不会要求你每次必须画一些东西来检查屏幕大小,就像许多答案所说的那样。这会发生在iPad上吗?
答案 0 :(得分:209)
所有应用程序将继续在垂直拉伸的屏幕上工作,从我今天的演示文稿中可以看出。它们将是letterboxed或基本上额外的88点高度只是黑色。
如果您只打算支持iOS 6+,那么一定要考虑使用自动布局。它删除了所有固定的布局处理,而是使用约束来解决问题。没有什么是硬编码的,你的生活将变得更加简单。
但是,如果您必须支持较旧的iOS,那么它实际上取决于您的应用程序。大多数使用标准导航栏和/或标签栏的应用程序可以简单地扩展中间的内容以消耗额外的点数。设置中心内容的自动调整遮罩以在两个方向上展开。
view.autoresizingMask = UIViewAutoresizingFlexibleWidth | UIViewAutoresizingFlexibleHeight;
它可以很好地开箱即用于桌面视图,但是,如果您的应用使用像素完美的布局来显示内容,那么您最好的选择是重新设想内容,以便它可以适应不同的高度。
如果这不可能,那么剩下的唯一选择就是拥有两个UI(iPhone 5和iPhone 5之前)。
如果听起来很难看,那么你可以使用默认的letterboxed模型,其中额外的点/像素只显示黑色。
修改强>
要使您的应用能够与iPhone 5配合使用,您需要添加启动器图像的视网膜版本。它应该命名为Default-568h@2x.png
。它必须是视网膜质量 - 这里没有向后兼容性:)
您也可以从Xcode中选择此图像。转到目标,然后在“摘要”部分下,查找“启动图像”。图像的大小必须为640x1136像素。这是一个截图,找到它的位置,如果有帮助的话。
答案 1 :(得分:84)
您需要添加640x1136像素PNG图像(Default-568h@2x.png
)作为项目的4英寸默认启动图像,并且它将使用额外的空间(无需基于简单表格的应用程序,游戏将需要更多的努力)。
为了处理所有屏幕分辨率,我创建了一个小型UIDevice类别。您可以get it here,但代码如下:
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
#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)将#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
}
答案 2 :(得分:56)
我刚刚完成更新并将其中一个应用程序的iOS 6.0版本发送到商店。此版本向后兼容iOS 5.0,因此我保留了shouldAutorotateToInterfaceOrientation:
方法并添加了下面列出的新方法。
我必须做以下事情:
iOS 6中的自动旋转正在发生变化。在iOS 6中,不推荐使用UIViewController的shouldAutorotateToInterfaceOrientation:
方法。取而代之的是,您应该使用supportedInterfaceOrientationsForWindow:
和shouldAutorotate
方法。
因此,我添加了这些新方法(并保持旧的iOS 5兼容性):
- (BOOL)shouldAutorotate {
return YES;
}
- (NSUInteger)supportedInterfaceOrientations {
return UIInterfaceOrientationMaskAllButUpsideDown;
}
viewWillLayoutSubviews
方法,并使用视图的边界矩形调整布局。 willRotateToInterfaceOrientation:duration:
,willAnimateRotationToInterfaceOrientation:duration:
和didRotateFromInterfaceOrientation:
个方法
任何视图控制器进行全屏演示
本身 - 例如,presentViewController:animated:completion:
。Default-568h@2x.png
,尺寸为640×1136。它也允许为相同的肖像模式提供640×1096(状态栏已删除)。如果您的应用仅在iPhone上允许横向显示,也可以在横向模式下提供相似的尺寸。armv6
代码的支持已被删除。因此,我现在能够支持的所有设备(运行armv7
)都可以升级到iOS 5。由于旋转的变化,这只是记得在iOS 5和iOS 6中测试自动旋转。
答案 3 :(得分:26)
没有
if ([[UIScreen mainScreen] bounds].size.height > 960)
iPhone 5上的错误
if ([[UIScreen mainScreen] bounds].size.height == 568)
答案 4 :(得分:17)
@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)
或
if ([UIDevice deviceType] & iPad)
如果您只想检测iPhone 5,可以使用
if ([UIDevice deviceType] & iPhone5)
与Malcoms的答案相反,你需要检查一下,看看它是否是iPhone,
if ([UIDevice currentResolution] == UIDevice_iPhoneHiRes ||
[UIDevice currentResolution] == UIDevice_iPhoneStandardRes ||
[UIDevice currentResolution] == UIDevice_iPhoneTallerHiRes)`
这两种方式都没有相互优势,这只是个人偏好。
答案 5 :(得分:5)
@Pascal对OP问题的评论是正确的。只需添加图像,它就会删除黑色边框,应用程序将使用全高。
您需要通过确定设备使用更大的显示器来调整任何CGRect。即如果你需要一些与屏幕底部对齐的东西。
我确信有一个内置的方法,但我还没有看到任何东西,还有很多仍然在NDA下,所以我们在我们的应用程序中使用的方法简直就是一个全局函数。将以下内容添加到.pch文件中,然后进行简单的if( is4InchRetina() ) { ... }
调用,以便对CGRect等进行调整。
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;
}
答案 6 :(得分:3)
我认为您可以使用[UIScreen mainScreen].bounds.size.height
并为您的对象计算步骤。计算步数时,您可以设置两个分辨率的坐标。
或者你可以获得如上所述的身高和if(iphone5) then... else if(iphone4) then... else if(ipad)
。这样的事情。
如果您使用故事板,那么您必须为我认为的新iPhone创建新的。
答案 7 :(得分:3)
由于高度像素较多,使用坐标的GCRectMake之类的版本无法在版本之间无缝地工作,就像我们收到Retina时一样。
嗯,他们做与Retina显示器一样工作 - 只是CoreGraphics坐标系中的1个单位对应2个物理像素,但你没有/不必做什么,逻辑保持不变。 (你有没有试过在视网膜iPhone上运行你的一个非视网膜应用程序,曾经?)
对于实际问题:这就是为什么你不应该使用显式CGRectMakes和co ...这就是为什么你有像[[UIScreen mainScreen] applicationFrame]
这样的东西。