如何支持截至2014年的各种iPhone屏幕尺寸?

我几乎完成了我的第一个iPhone应用程序,并试图添加一个背景图像,我觉得有点混乱,因为如今有不同的iPhone版本中的3或4个不同大小的屏幕,以不同的分辨率启动。

所以当我意识到整个事情的时候,我还是不知道自己真正需要什么。 如果我希望我的应用能够在iPhone 4 / 4s,5s / 5c,6/6 +上运行,我需要多less个不同版本的背景图像,以及尺寸和分辨率是多less?

我已经search了一下,到2014年还没有发现任何有凝聚力的答案。

另外,如果iPhone 6是1334×750 @ 3x,这是否意味着我应该包括4002×2250背景? 然后为1920×1080 iPhone 6 + @ 3x,一个5760 x 3240图像? 这是巨大的! 我觉得我必须正确地理解这一点。

如果您想支持iPhone 6 / Plus的原始分辨率,则需要添加启动图像(在iOS 8之前)或启动屏幕xib(iOS 8)。

iPhone 4 / 4S:640 x 960

iPhone 5 / 5S:640 x 1136

iPhone 6:750 x 1334

iPhont 6 Plus:1242 x 2208

这意味着如果要支持这些设备,则需要准备4个具有上述分辨率的启动图像。 您可以使用iOS模拟器捕捉不同分辨率的屏幕截图。 如果无法find特定分辨率的启动图像,则您的应用程序将在新分辨率设备上以compatibility mode运行。 compatibility mode意味着您的视图将被缩放以适应新的屏幕尺寸,但仍具有相同的逻辑大小。

编辑:

我认为op误解了@2x@3x意思。 iPhone 6的分辨率是750(pixels) x 1334(pixels), 326 pixels per inch 。 这是真正的决议。 如果支持原始分辨率,则375(points) x 667(points)是逻辑大小。 iPhone 6 Plus的分辨率为1242(pixels) x 2208(pixels), 401 pixels per inch ,逻辑尺寸为414(points) x 736(points)

这是不同的分辨率的图像如何在iOS设备上工作:

假设您想在iPhone 4s,iPhone 5 / 5S,iPhone 6 / plus上运行您的应用程序。 你应该做的第一件事是提供4个启动图像来支持这些设备的原始分辨率。 当iOS启动您的应用程序时,它将检查应用程序是否提供正确的启动映像以支持当前设备的本地分辨率。 如果iOS发现它,然后在启动时使用,屏幕的逻辑大小是正确的 ,你的应用程序正常运行。 否则,您的应用程序将以compatibility mode运行,其中将缩放所有视图。

假设在您的应用程序中有一个名为foo.png的图像,其逻辑大小为100(points) x 100(points) 。 你想要这个图像看起来在所有上述设备相同。 你应该提供这个图像的2个版本。 一个是200(pixels) x 200 (pixels) ,应该命名为foo.png@2x ,另一个是300(pixels) x 300(pixels)命名为foo.png@3x 。 如果你用[UIImage imageNamed:@"foo"]加载这个图像,除了iPhone 6 plus以外的设备,这个应用程序将加载名为foo.png@2x的图像。 否则,应用程序将加载foo.png@3x并将其采样到300 * 84%(像素)x 300 * 84%(像素)。

如果你从一个URL加载图像,并需要在运行时渲染它。 假设你得到的尺寸是{width:100, height:100} ,比例是1.0 。 这意味着这个图像的实际大小是100 * 1.0(pixels) x 100 * 1.0(pixels ,如果您不希望它被缩放,您需要自己计算逻辑大小。

 UIImage *image = ... // you get it from an url CGFloat scale = [UIScreen mainScreen].scale; CGFloat width = image.size.width / scale; CGFloat height = image.size.height / scale; CGRect frame = CGRectMake(50.0f, 50.0f, width, height)]; UIImageView *imageView = [[UIImageView alloc] initWithFrame:frame]; imageView.contentMode = UIViewContentModeCenter; imageView.image = image; [self.view addSubview:imageView]; 

我认为最简单的方法是使用适合iPhone 6+的图像,然后简单地将UIImageViewcontentMode设置为UIViewContentModeCenter 。 我认为至less是这样的,结果应该是在iPhone 6+上有一个居中的图像,但在其他屏幕上,您只需获取图像的一部分。

iPhone 6+的下采样意味着覆盖整个屏幕的@ 3x资产应该是2208×1242(也就是说,这个分​​辨率已经是3x,“真实”的分辨率是736×414)。 这是所需的最大分辨率,然后您可以使用我描述的方法对@ 2x和@ 1x资产使用相同的图像。

您将需要三个版本的背景图像(1x,2x,3x)。有一个正确的大小的图像的一个良好的做法是使图像的大小是您的视图的大小的3倍,然后使2x和1x版本缩小。

苹果已经提出了一个名为“尺寸类”的新概念来支持不同的设备尺寸。要使用尺寸类,您将需要最新版本的Xcode(Xcode 6)。 在界面生成器中,您可以为不同的大小类别设置不同的约束。 这样,支持所有屏幕尺寸变得更容易。 要了解更多关于大小类的信息,请观看WWDC 2014video“使用UIKit构build适应性应用程序”。

你使用哪个游戏引擎? 如果您使用的是cocos2d或cocos2dx,那么您可以使用960 * 640的背景图像。下面的代码将根据屏幕大小缩放图像。

 CCSize frameSize = pEGLView->getFrameSize(); CCSize designSize = CCSizeMake(480, 320); vector<string> searchPaths; CCSize resourceSize; Utility :: isPad = true; searchPaths.push_back("hd"); resourceSize = CCSizeMake(960, 640); CCEGLView::sharedOpenGLView()->setDesignResolutionSize(designSize.width , designSize.height, kResolutionExactFit); pDirector->setContentScaleFactor(resourceSize.width/designSize.width); 

这些是您将需要为您的背景图像不同的决议。

  1. iPhone 4 / 4S – 640 * 960
  2. iPhone 5 / 5S – 640 * 1136
  3. iPhone 6 – 750 x 1334肖像1334 x 750的景观
  4. iPhone 6 Plus – 1242 x 2208肖像2208 x 1242景观