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

新的iPhone 5屏幕有新的纵横比和新的分辨率(640 x 1136像素)。

开发新的应用程序或将现有应用程序转换到新的屏幕尺寸需要什么?

我们应该记住什么,使应用程序“通用”的旧显示器和新的宽屏纵横比?

149826 次浏览
  1. 下载并安装最新版本的Xcode
  2. 为你的应用程序设置一个启动屏幕文件(在目标设置的general选项卡中)。这就是如何使用任何屏幕的全尺寸,包括iOS 9中的iPad分屏视图大小。
  3. 测试你的应用,希望不要做其他事情,因为如果你正确设置了自动调整蒙版,或使用了自动布局,一切都应该神奇地工作。
  4. 如果你没有,调整你的视图布局,最好使用自动布局。
  5. 如果你必须为大屏幕做一些事情,那么看起来你必须检查[[UIScreen mainScreen] bounds]的高度,因为似乎没有特定的API。在iOS 8中,也有一些尺寸类,可以将屏幕大小抽象为垂直和水平的常规或紧凑,这是适应你的UI的推荐方法。

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

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

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

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

在这里你可以找到一个很好的教程(MonoTouch,但你也可以使用非MonoTouch项目的信息) http://redth.info/get-your-monotouch-apps-ready-for-iphone-5-ios-6-today/ < / p >
  1. 为您的splash/default屏幕创建一个新图像(640 x 1136像素),名称为“Default-568h@2x.png

  2. iOS模拟器,进入硬件->设备菜单,选择“iPhone(视网膜4英寸)

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

  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());
}
}

如果你的应用是为iPhone 4S或更早版本开发的,那么它将在iPhone 5上运行letterbox。

为了使你的应用程序适应新的更高的屏幕,你要做的第一件事是将启动图像更改为:Default-568h@2x.png。其大小应为1136x640 (HxW)。是的,在新的屏幕大小中设置默认图像是让你的应用占据整个新iPhone 5屏幕的关键

(注意,命名约定只适用于默认映像。将另一个图像命名为“Image-568h@2x.png”不会导致它取代“Image@2x.png”被加载。如果你需要为不同的屏幕大小加载不同的图像,你必须通过编程来实现。)

如果你非常非常幸运,可能就是这样……但十有八九是你还得再走几步。

  • 确保你的xib / view使用自动布局来调整自己的大小。
  • 使用spring和struts来调整视图的大小。
  • 如果这对你的应用不够好,设计你的xib/storyboard 的特定屏幕尺寸和以编程方式重新定位 李。< / >

在极端情况下(当以上都不满足时),设计两个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
    }
}

你可以添加以下代码:

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");
}
}

Peter,你真的应该看看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的工作原理类似于界面生成器和故事板的结合,除了它是文本形式。如果已经有XIB文件,可以转换它们,这样就不必从头重新创建整个UI。

有时(对于前故事板应用程序),如果布局将有足够的不同,值得在viewController init中根据设备指定不同的xib(参见这个问题 -你需要修改代码来处理iPhone 5),因为如果你需要不同的图形,再多的自动调整蒙版也不起作用。

-(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版本的应用程序非常有用。

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

然后我注意到我的信息plist有一个行项目“启动画面”设置为“Default.png”,因此我删除了它,神奇地,字母盒不再出现。希望这能让别人免受我所经历的疯狂。

要确定你的应用程序是否支持iPhone 5 Retina,请使用以下方法: (这可以更健壮地返回显示类型,4S视网膜等,但正如下面所写的,它只返回如果iPhone支持iOS5视网膜为YES或NO)

在一个普通的“。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;
}

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

我从未在任何设备上遇到过这样的问题,因为我有一个代码库,没有任何硬编码的值。我所做的是将最大大小的图像作为资源,而不是为每个设备提供一个。例如,我会有一个视网膜显示,并显示它的方面适合,所以它将是视图,因为是在每个设备上。 来决定按钮的框架,例如,在运行时。为此,我使用专利视图的%值,例如,如果我想要宽度为父视图的一半,则取父视图的50%,同样适用于高度和中心。< / p >

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

通过xib .........很容易迁移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];
}

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)

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

这是一个宏,它处理方向状态:

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

'preferredMode'调用的使用来自我几个小时前读的另一篇文章,所以我没有想到这个想法。

你可以使用Auto Layout特性并使用iPhone 5屏幕分辨率创建设计,它将适用于4英寸和3.5英寸设备,但在这种情况下,你应该有足够的布局管理器知识。

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

-(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";
}

我想,它不是在所有情况下都能工作,但在我的特定项目中,它避免了我对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...
}

根据我处理这些问题的最佳方式,避免两个条件需要检查设备的高度,使用视图或任何UI元素的相对框架增加你视图的例子:如果你是你想应该添加一些UI元素的底部视图或略高于标签栏然后你应该把y起源对视图的高度或标签栏(如果存在)和我们也有自动调整属性。我希望这对你有用

你可以使用这个定义来计算你是否使用基于屏幕大小的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
}

你可以手动检查屏幕大小来确定你在哪个设备上:

#define DEVICE_IS_IPHONE5 ([[UIScreen mainScreen] bounds].size.height == 568)


float height = DEVICE_IS_IPHONE5?568:480;
if (height == 568) {
// 4"


} else {


// 3"


}

首先显示这张图片。在那个图像中,你显示了视网膜4支持的警告,所以点击这个警告,然后点击添加,这样你的视网膜4启动屏幕自动添加到你的项目中。

Show image here

在你使用这段代码之后

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

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

设置你的项目通用模式,并设置你的主要故事iPhone与iPhone5故事板和ipad主要与ipad目标故事板,现在添加新的故事板目标iPhone和修改分辨率为iPhone 4s或更少现在实现你的AppDelegate.m

iPhone4/4s(对于3/3Gs是一样的)一个用于iPhone5,并创建项目通用,为iPad添加一个新的Storyboard目标,现在在didFinishLaunching下的AppDelegate.m中添加以下代码:

    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/ 3g /4/4s/5所有一代的iPod和所有类型的iPad创建了一个通用应用程序

记住将所有IMG与myImage.pngmyImage@2x.png集成

首先,创建两个xib并将所有委托、main类附加到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类中。最重要的是你已经为iphone 4(320*480) and iphone 5(320*568)单独创建了两个xib文件

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

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

在我的情况下,我想要一个视图,填补在顶部的一些输入字段和底部的一些按钮之间的空间,所以固定的左上角和变量右下角基于屏幕大小。我的应用程序用相机拍摄的照片填充图像视图,所以我想要尽可能多的空间。

如果你需要将一个已经存在的应用程序转换为通用,你需要选择相应的xib文件->show Utilities-> show Size inspector。

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

使用xCode 5,在项目>General上选择“迁移到资产目录”。

然后使用“Show in finder”找到你的启动图像,你可以模拟编辑它为640x1136,然后拖到资产目录,如下图所示。

确保iOS7和iOS6 R4部分都有一个640x1136的图像。下次你启动应用程序时,黑条将消失,你的应用程序将使用4英寸屏幕

enter image description here

我建议在你的应用程序中根据你的UI界面使用自动调整蒙版,这节省了很多麻烦,比为iPhone 4和5屏幕制作不同的UI更好。

值得注意的是,在新的Xcode中,你必须将这个图像文件Default-568h@2x.png添加到资产中

在iOS设备和iOS模拟器上测试时,有一个小问题。根据设备方向,模拟器(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
}

对视图使用Auto Layout特性。它将自动调整到所有分辨率。

为控制器名称后缀为~iphone或~ipad的控制器创建两个xib。在编译时,Xcode将根据设备取正确的xib。

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