如何开发或迁移iPhone 5屏幕分辨率的应用程序?

新的iPhone 5显示屏具有新的宽高比和新的分辨率(640 x 1136像素)。

开发新的或已经存在的应用程序到新的屏幕大小需要什么?

我们应该记住什么来使应用程序对旧显示器和新宽屏高宽比具有“通用性”?

  1. 下载并安装最新版本的Xcode 。
  2. 为您的应用程序设置启动屏幕文件(在目标设置的常规选项卡中)。 这是如何使用任何屏幕的全尺寸,包括在iOS 9中的iPad拆分视图大小。
  3. testing你的应用程序,希望别的什么都不要做,因为如果你已经正确设置了自动resize的掩码,或者使用了自动布局,所有的东西都应该可以神奇地工作。
  4. 如果没有,请调整视图布局,最好使用“自动布局”。
  5. 如果您需要为大屏幕做特别的事情,那么看起来您必须检查[[UIScreen mainScreen] bounds]高度,因为似乎没有特定的API。 从iOS 8开始,还有尺寸类别,可以将屏幕尺寸抽象为垂直和水平方向的常规或紧凑尺寸,并且是推荐的方法来调整UI。

如果您有为iPhone 4S或更早版本构build的应用程序,它将在iPhone 5上运行letterbox。

要使您的应用适应新的更高屏幕,首先要将启动图像更改为:Default-568h@2x.png。 它的大小应该是1136×640(HxW)。 是的,在新的屏幕大小的默认图像是让你的应用程序采取整个新的iPhone 5的屏幕的关键

(请注意,命名约定只适用于默认图像,命名另一个图像“Image-568h@2x.png”不会导致它被加载,而不是“Image@2x.png”如果你需要加载不同的图像对于不同的屏幕尺寸,您必须以编程方式执行。)

如果你非常幸运,那可能是…但很可能, 你必须采取更多的步骤。

  • 确保你的Xibs / Views使用自动布局来调整自己的大小。
  • 使用弹簧和支柱来调整视图的大小。
  • 如果这对于您的应用程序来说不够好,请为您的应用程序devise一个特定屏幕大小的xib / storyboard并以编程方式重新定位另一个。

在极端的情况下(当没有上述情况时),devise两个Xib并在视图控制器中加载相应的Xib。

要检测屏幕大小:

 if(UI_USER_INTERFACE_IDIOM() == UIUserInterfaceIdiomPhone) {    CGSize result = [[UIScreen mainScreen] bounds].size;    if(result.height == 480) { // iPhone Classic    }    if(result.height == 568) { // iPhone 5    } } 

唯一真正需要做的就是向应用程序资源中添加一个名为“Default-568h@2x.png”的启动映像,一般情况下(如果您足够幸运),应用程序将正常工作。

如果应用程序不处理触摸事件,那么确保关键窗口具有适当的大小。 解决方法是设置适当的框架:

 [window setFrame:[[UIScreen mainScreen] bounds]] 

在迁移到iOS 6时,还有其他与屏幕大小无关的问题。有关详细信息,请阅读iOS 6.0发行说明 。

有时(对于预故事板应用程序),如果布局将有足够的差异,那么在viewController中根据设备指定一个不同的xib(请参阅此问题 – 您需要修改代码以处理iPhone 5)初始化,因为如果你需要不同的graphics,那么在自动调整掩码的情况下不会有太多的麻烦。

 -(id)initWithNibName:(NSString *)nibNameOrNil bundle:(NSBundle *)nibBundleOrNil NSString *myNibName; if ([MyDeviceInfoUtility isiPhone5]) myNibName = @"MyNibIP5"; else myNibName = @"MyNib"; if ((self = [super initWithNibName:myNibName bundle:nibBundleOrNil])) { ... 

这对于定位旧iOS版本的应用程序很有用。

在这里,您可以find一个很好的教程(对于MonoTouch,但是您也可以将这些信息用于非MonoTouch项目):
http://redth.info/get-your-monotouch-apps-ready-for-iphone-5-ios-6-today/

  1. 为您的飞溅/默认屏幕( 640 x 1136像素 )创build一个名为“ Default-568h@2x.png ”的新图像

  2. iOS模拟器中 ,进入硬件 – >设备菜单,select“ iPhone(Retina 4-inch)

  3. 创build其他图像,例如背景图像

  4. 检测iPhone 5加载您的新图像:

 public static bool IsTall { get { return UIDevice.currentDevice.userInterfaceIdiom == UIUserInterfaceIdiomPhone && UIScreen.mainScreen.bounds.size.height * UIScreen.mainScreen.scale >= 1136; } } 

 private static string tallMagic = "-568h@2x"; public static UIImage FromBundle16x9(string path) { //adopt the -568h@2x naming convention if(IsTall()) { var imagePath = Path.GetDirectoryName(path.ToString()); var imageFile = Path.GetFileNameWithoutExtension(path.ToString()); var imageExt = Path.GetExtension(path.ToString()); imageFile = imageFile + tallMagic + imageExt; return UIImage.FromFile(Path.Combine(imagePath,imageFile)); } else { return UIImage.FromBundle(path.ToString()); } } 

通过XIBs轻松移植iPhone5和iPhone4 ………

 UIViewController *viewController3; if ([[UIScreen mainScreen] bounds].size.height == 568) { UIViewController *viewController3 = [[[mainscreenview alloc] initWithNibName:@"iphone5screen" bundle:nil] autorelease]; } else { UIViewController *viewController3 = [[[mainscreenview alloc] initWithNibName:@"iphone4screen" bundle:nil] autorelease]; } 

我在这里解决这个问题。 只需在图像中添加〜568h @ 2x后缀,在xib中添加〜568h。 不需要更多的运行时检查或代码更改。

我已经添加了新的默认启动图像和(在检查出其他几个SE答案…)确保我的故事板都自动调整自己的大小和子视图,但视网膜4英寸仍letterboxed。

然后我注意到,我的信息plist有一个“启动图像”设置为“Default.png”的行项目,我已经删除,神奇的信箱不再出现。 希望能够拯救别人和我一样的疯狂。

我想,这不会在所有情况下工作,但在我的特定项目中,它避免了我重复NIB文件:

common.h某处,可以根据屏幕高度进行这些定义:

 #define HEIGHT_IPHONE_5 568 #define IS_IPHONE ([[UIDevice currentDevice] userInterfaceIdiom] == UIUserInterfaceIdiomPhone) #define IS_IPHONE_5 ([[UIScreen mainScreen] bounds ].size.height == HEIGHT_IPHONE_5) 

在您的基础控制器中:

 - (void)viewDidLoad { [super viewDidLoad]; if (IS_IPHONE_5) { CGRect r = self.view.frame; r.size.height = HEIGHT_IPHONE_5 - 20; self.view.frame = r; } // now the view is stretched properly and not pushed to the bottom // it is pushed to the top instead... // other code goes here... } 

constants.h文件中,你可以添加这些定义语句:

  #define IS_IPAD UI_USER_INTERFACE_IDIOM() == UIUserInterfaceIdiomPad #define IS_IPHONE UI_USER_INTERFACE_IDIOM() == UIUserInterfaceIdiomPhone #define IS_WIDESCREEN (fabs((double)[[UIScreen mainScreen] bounds].size.height - (double)568) < DBL_EPSILON) #define IS_IPHONE_5 (!IS_IPAD && IS_WIDESCREEN) 

要确定您的应用程序是否可以支持iPhone 5视网膜,请使用以下命令:(这可能会更加稳健,以返回显示types,4S Retina等,但是如下所示,只要iPhone支持iOS5视网膜是或否)

在一个常见的“.h”文件中添加:

 BOOL IS_IPHONE5_RETINA(void); 

在一个普通的“.m”文件中添加:

 BOOL IS_IPHONE5_RETINA(void) { BOOL isiPhone5Retina = NO; if(UI_USER_INTERFACE_IDIOM() == UIUserInterfaceIdiomPhone) { if ([UIScreen mainScreen].scale == 2.0f) { CGSize result = [[UIScreen mainScreen] bounds].size; CGFloat scale = [UIScreen mainScreen].scale; result = CGSizeMake(result.width * scale, result.height * scale); if(result.height == 960){ //NSLog(@"iPhone 4, 4s Retina Resolution"); } if(result.height == 1136){ //NSLog(@"iPhone 5 Resolution"); isiPhone5Retina = YES; } } else { //NSLog(@"iPhone Standard Resolution"); } } return isiPhone5Retina; } 

首先创build两个xib,并将所有代理,主类添加到xib ,然后你可以在你的appdelegate.m文件中添加下面提到的这个条件

 - (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions if ([[UIScreen mainScreen] bounds].size.height == 568) { self.ViewController = [[ViewController alloc] initWithNibName:@"ViewControlleriphone5" bundle:nil]; } else { self.ViewController = [[ViewController alloc] initWithNibName:@"ViewControlleriphone4" bundle:nil]; } 

你甚至可以在你的ViewController类中根据你的需求在程序中的任何地方使用它。 最重要的是,你已经创build了两个独立的iphone 4(320*480) and iphone 5(320*568)

在单例类中尝试下面的方法:

 -(NSString *)typeOfDevice { if(UI_USER_INTERFACE_IDIOM() == UIUserInterfaceIdiomPhone) { CGSize result = [[UIScreen mainScreen] bounds].size; if(result.height == 480) { return @"Iphone"; } if(result.height == 568) { return @"Iphone 5"; } } else{ return @"Ipad";; } return @"Iphone"; } 

您可以使用“ Auto Layoutfunction并使用iPhone 5屏幕分辨率创builddevise,并且可以同时适用于4“和3.5”设备,但是在这种情况下,您应该对布局pipe理器有足够的了解。

使用568检查bounds将在横向模式下失败。 iPhone 5只在肖像模式下启动,但如果你想支持旋转,那么iPhone 5的“检查”也需要处理这种情况。

这是一个处理方向状态的macros:

 #define IS_IPHONE_5 (CGSizeEqualToSize([[UIScreen mainScreen] preferredMode].size, CGSizeMake(640, 1136))) 

“preferredMode”电话的使用来自我几个小时前阅读的另一篇文章,所以我没有提出这个想法。

首先显示这个图像。 在该图像中,您将显示Retina 4支持的警告,所以单击此警告并单击添加,以便您的Retina 4启animation面自动添加到您的项目中。

在这里显示图像

并使用此代码后:

 if([[UIScreen mainScreen] bounds].size.height == 568) { // For iphone 5 } else { // For iphone 4 or less } 

我从来没有面对任何设备的问题,因为我已经有一个代码库,没有任何硬编码值。 我所做的是将最大尺寸的图像作为资源,而不是每个设备一个。 例如,我将有一个视网膜显示器,并显示为方面适合,所以它将是每个设备上的意见。 例如,在运行时决定button的框架。 为此,我使用专利视图的%值,例如,如果我想将宽度设置为父视图的一半,则采用父视图的50%,同样适用于高度和中心。

有了这个,我甚至不需要xibs。

您可以使用此定义来计算您是否使用基于屏幕尺寸的iPhone 5:

 #define IS_IPHONE_5 ( fabs( ( double )[ [ UIScreen mainScreen ] bounds ].size.height - ( double )568 ) < DBL_EPSILON ) 

然后使用一个简单的if语句:

  if (IS_IPHONE_5) { // What ever changes } 

彼得,你真的应该看看Canappi,它为你做了一切,你只需要指定布局就可以了:

 button mySubmitButton 'Sumbit' (100,100,100,30 + 0,88,0,0) { ... } 

从那里Canappi将生成正确的Objective-C代码,检测应用程序正在运行的设备,并将使用:

 (100,100,100,30) for iPhone4 (100,**188**,100,30) for iPhone 5 

Canappi与Interface Builder和Story Board相结合,除了它是一个文本forms。 如果你已经有XIB文件,你可以转换它们,所以你不必从头开始重新创build整个UI。

您可以手动检查屏幕大小以确定您正在使用的设备:

 #define DEVICE_IS_IPHONE5 ([[UIScreen mainScreen] bounds].size.height == 568) float height = DEVICE_IS_IPHONE5?568:480; if (height == 568) { // 4" } else { // 3" } 

你可以添加下面的代码:

 if(UI_USER_INTERFACE_IDIOM() == UIUserInterfaceIdiomPhone){ if ([[UIScreen mainScreen] respondsToSelector: @selector(scale)]) { CGSize result = [[UIScreen mainScreen] bounds].size; CGFloat scale = [UIScreen mainScreen].scale; result = CGSizeMake(result.width * scale, result.height * scale); if(result.height == 960) { NSLog(@"iPhone 4 Resolution"); } if(result.height == 1136) { NSLog(@"iPhone 5 Resolution"); } } else{ NSLog(@"Standard Resolution"); } } 

这是一个真正的通用代码,可以创build3个不同的故事板:

设置您的项目通用模式,并设置您的主要故事iPhone与iPhone5的故事板和ipad与iPad的目标故事板的主,现在为iphone添加新的故事板目标,并修改为iPhone 4s或更less的决议现在执行您的AppDelegate.m

iPhone4 / 4s (对于3G / 3Gs是相同的)一个用于iPhone5 ,并使项目具有通用性 ,具有针对iPad的新的Storyboard目标,现在在AppDelegate.m下,在didFinishLaunching添加以下代码:

  if(UI_USER_INTERFACE_IDIOM() == UIUserInterfaceIdiomPhone){ UIStoryboard *storyBoard; CGSize result = [[UIScreen mainScreen] bounds].size; CGFloat scale = [UIScreen mainScreen].scale; result = CGSizeMake(result.width *scale, result.height *scale); //----------------HERE WE SETUP FOR IPHONE4/4s/iPod---------------------- if(result.height == 960){ storyBoard = [UIStoryboard storyboardWithName:@"iPhone4_Storyboard" bundle:nil]; UIViewController *initViewController = [storyBoard instantiateInitialViewController]; [self.window setRootViewController:initViewController]; } //----------------HERE WE SETUP FOR IPHONE3/3s/iPod---------------------- if(result.height == 480){ storyBoard = [UIStoryboard storyboardWithName:@"iPhone4_Storyboard" bundle:nil]; UIViewController *initViewController = [storyBoard instantiateInitialViewController]; [self.window setRootViewController:initViewController]; } } return YES; } 

所以你已经为iPhone 3 / 3Gs / 4 / 4s / 5创build了一个通用的应用程序,所有types的iPad和所有types的iPad

请记住将所有IMG与myImage.pngmyImage@2x.png进行整合

根据我的处理这些问题的最佳方法,并避免检查设备的高度所需的条件,是使用相对框架的意见或任何UI元素,你正在添加到您查看例如:如果您添加你想要的一些UI元素应该在视图的底部或只是在标签栏上方,那么你应该采取y原点相对于你的视图的高度或相对于标签栏(如果存在),我们也有自动resize的财产。 我希望这会对你有用

您可以使用屏幕大小自动调整视图的大小,而不是使用一组条件。

 int h = [[UIScreen mainScreen] bounds].size.height; int w = [[UIScreen mainScreen] bounds].size.width; self.imageView.frame = CGRectMake(20, 80, (h-200), (w-100)); 

在我的情况下,我想要一个视图,填充顶部的一些input字段和底部的一些button之间的空间,所以根据屏幕大小固定左上angular和可变右下angular。 我的应用程序用照相机拍摄的照片填充图像视图,所以我想要所有的空间,我可以得到。

如果您需要将现有应用程序转换为通用应用程序,则需要select相应的xib文件 – >显示实用程序 – >显示大小检查器。

在大小检查器,你可以看到自动调整,通过使用这个工具,你可以转换到现有的iOS应用程序。

使用xCode 5,在项目>常规上select“迁移到资产目录”。

然后使用“在查找器中显示”来查找启动图像,可以将其虚拟编辑为640×1136,然后将其拖到资产目录中,如下图所示。

确保iOS7和iOS6 R4部分的图像是640×1136。 下次启动应用程序时,黑条将消失,您的应用程序将使用4英寸的屏幕

在这里输入图像描述

值得注意的一点 – 在新的Xcode你必须添加这个图像文件Default-568h@2x.png资产

使用Auto Layoutfunction的意见。 它会自动调整到所有分辨率。

为具有控制器名称的控制器创build两个xib,后缀为〜iphone或〜ipad。 在编译时,Xcode将根据设备采用正确的xib。

如果你想为iPhone和iPad创build一个单独的xib,如果视图足够简单,就可以移植到iPhone和iPad,那么使用大小类。

在iOS设备和iOS模拟器上进行testing时有一个小问题。 仿真器(XCode 6.0.1)在[[UIScreen mainScreen] bounds].size给出了宽度和高度的切换值,具体取决于设备的方向。

所以在确定正确的物理屏幕尺寸时,这可能是个问题。 此代码也有助于区分所有2014年。iPhone模型世代:

  • 的iPhone4s
  • iPhone5(和iPhone5s)
  • iPhone6(和iPhone6 +)

它也可以很容易地改变,例如iPhone6与iPhone6 +之间的区别。

 - (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions { CGSize iOSDeviceScreenSize = [[UIScreen mainScreen] bounds].size; if ([UIDevice currentDevice].userInterfaceIdiom == UIUserInterfaceIdiomPhone) { if (iOSDeviceScreenSize.width > 568 || // for iOS devices iOSDeviceScreenSize.height > 568) // for iOS simulator { // iPhone 6 and iPhone 6+ // Instantiate a new storyboard object using the storyboard file named Storyboard_iPhone6 storyboard = [UIStoryboard storyboardWithName:@"MainStoryboard_iPhone6" bundle:nil]; NSLog(@"loaded iPhone6 Storyboard"); } else if (iOSDeviceScreenSize.width == 568 || // for iOS devices iOSDeviceScreenSize.height == 568) // for iOS simulator { // iPhone 5 and iPod Touch 5th generation: 4 inch screen (diagonally measured) // Instantiate a new storyboard object using the storyboard file named Storyboard_iPhone5 storyboard = [UIStoryboard storyboardWithName:@"MainStoryboard_iPhone5" bundle:nil]; NSLog(@"loaded iPhone5 Storyboard"); } else { // iPhone 3GS, 4, and 4S and iPod Touch 3rd and 4th generation: 3.5 inch screen (diagonally measured) // Instantiate a new storyboard object using the storyboard file named Storyboard_iPhone4 storyboard = [UIStoryboard story boardWithName:@"MainStoryboard_iPhone" bundle:nil]; NSLog(@"loaded iPhone4 Storyboard"); } } else if ([UIDevice currentDevice].userInterfaceIdiom == UIUserInterfaceIdiomPad) { // The iOS device = iPad storyboard = [UIStoryboard storyboardWithName:@"MainStoryboard_iPadnew" bundle:nil]; NSLog(@"loaded iPad Storyboard"); } // rest my code } 

我build议根据您的UI界面在您的应用程序中使用Autoresizing Mask,这样可以节省很多麻烦,比为iPhone 4和iPhone 5制作不同的UI更好。