苹果官网称分辨率为1080p:1920 x 1080
但是,Xcode(今天推出的 8.0 GM)所需的启动屏幕是 2208 x 1242。
谁是对的?
https://i.stack.imgur.com/Sx7Ig.png
iPhone 6+ 在内部使用 @3x 资源以 2208×1242(736x414 点)的虚拟分辨率进行渲染,然后对其进行采样以进行显示。与在 Retina MacBook 上使用缩放分辨率相同——它可以让它们达到像素资产的整数倍,同时仍然让例如 12 pt 文本在屏幕上看起来相同大小。
所以,是的,启动屏幕需要是那个大小。
数学:
6、5s、5、4s 和 4 都是每英寸 326 像素,并使用@2x 资产来坚持之前所有设备的每英寸大约 160 点。
6+ 是每英寸 401 像素。所以假设它需要大约 2.46 倍的资产。相反,Apple 使用 @3x 资产并将完整输出缩减到其自然规模的 84% 左右。
在实践中,Apple 决定采用 87% 左右的比例,将 1080 变成 1242。毫无疑问,这是为了找到尽可能接近 84% 的值,但仍能在两个方向上产生整数尺寸——1242/1080 = 2208/1920 正好,而如果您将 1080 转换为 1286,则您需要以某种方式垂直渲染 2286.22 像素才能很好地缩放。
答案是旧应用程序在 2208 x 1242 缩放模式下运行。但是,当为新手机构建应用程序时,可用的分辨率为:Super Retina HD 5.8 (iPhone X) 1125 x 2436 (458ppi)、Retina HD 5.5 (iPhone 6、7、8 Plus) 1242 x 2208 和 Retina HD 4.7 ( iPhone 6)750 x 1334。这导致了问题中提到的混乱。要构建使用新手机全屏尺寸的应用,请添加以下尺寸的 LaunchImage:1125 x 2436、1242 x 2208、2208 x 1242 和 750 x 1334。
针对新 iPhone 12、12 mini、12 Pro、12 Pro Max 进行了更新
iPhone 12 Pro Max 的尺寸,@3x 缩放,坐标空间:428 x 926 点和 1284 x 2778 像素,458 ppi,设备物理尺寸为 3.07 x 6.33 英寸或 78.1 x 160.8 毫米。 6.7 英寸超视网膜 XDR 显示屏。
iPhone 12 Pro 的尺寸,@3x 缩放,坐标空间:390 x 844 点和 1170 x 2532 像素,460 ppi,设备物理尺寸为 2.82 x 5.78 英寸或 71.5 x 146.7 毫米。 6.1 英寸超视网膜 XDR 显示屏。
iPhone 12 的尺寸,@2x 缩放,坐标空间:585 x 1266 点和 1170 x 2532 像素,460 ppi,设备物理尺寸为 2.82 x 5.78 英寸或 71.5 x 146.7 毫米。 6.1 英寸超视网膜 XDR 显示屏。
iPhone 12 mini 的尺寸,@2x 缩放,坐标空间:540 x 1170 点和 1080 x 2340 像素,476 ppi,设备物理尺寸为 2.53 x 5.18 英寸或 64.2 x 131.5 毫米。 5.4 英寸超视网膜 XDR 显示屏。
iPhone 11 Pro Max 的尺寸,@3x 缩放,坐标空间:414 x 896 点和 1242 x 2688 像素,458 ppi,设备物理尺寸为 3.06 x 6.22 英寸或 77.8 x 158.0 毫米。 6.5 英寸超视网膜 XDR 显示屏。
iPhone 11 Pro 的尺寸,@3x 缩放,坐标空间:375 x 812 点和 1125 x 2436 像素,458 ppi,设备物理尺寸为 2.81 x 5.67 英寸或 71.4 x 144.0 毫米。 5.8 英寸超视网膜 XDR 显示屏。
iPhone 11 的尺寸,@2x 缩放,坐标空间:414 x 896 点和 828 x 1792 像素,326 ppi,设备物理尺寸为 2.98 x 5.94 英寸或 75.7 x 150.9 毫米。 6.1 英寸液态视网膜高清显示屏。
iPhone X🅂 Max 尺寸@3x 缩放(Apple 名称:Super Retina HD 6.5 display"),坐标空间:414 x 896 点和 1242 x 2688 像素,458 ppi,设备物理尺寸为 3.05 x 6.20 英寸或 77.4 x 157.5毫米。
let screen = UIScreen.main
print("Screen bounds: \(screen.bounds), Screen resolution: \(screen.nativeBounds), scale: \(screen.scale)")
//iPhone X🅂 Max Screen bounds: (0.0, 0.0, 414.0, 896.0), Screen resolution: (0.0, 0.0, 1242.0, 2688.0), scale: 3.0
iPhone X🅁 尺寸@2x 缩放(Apple 名称:Super Retina HD 6.1" 显示器),坐标空间:414 x 896 点和 828 x 1792 像素,326 ppi,设备物理尺寸为 2.98 x 5.94 英寸或 75.7 x 150.9 毫米.
let screen = UIScreen.main
print("Screen bounds: \(screen.bounds), Screen resolution: \(screen.nativeBounds), scale: \(screen.scale)")
//iPhone X🅁 Screen bounds: (0.0, 0.0, 414.0, 896.0), Screen resolution: (0.0, 0.0, 828.0, 1792.0), scale: 2.0
iPhone X🅂 和 iPhone X 尺寸@3x 缩放(Apple 名称:Super Retina HD 5.8" display),坐标空间:375 x 812 点和 1125 x 2436 像素,458 ppi,设备物理尺寸为 2.79 x 5.65 英寸或 70.9 x 143.6 毫米。
let screen = UIScreen.main
print("Screen bounds: \(screen.bounds), Screen resolution: \(screen.nativeBounds), scale: \(screen.scale)")
//iPhone X🅂 and X Screen bounds: (0.0, 0.0, 375.0, 812.0), Screen resolution: (0.0, 0.0, 1125.0, 2436.0), scale: 3.0
https://i.stack.imgur.com/ZENS1.jpg
iPhone 6、6S、7 和 8 的尺寸,@3x 缩放(Apple 名称:Retina HD 5.5),坐标空间:414 x 736 点和 1242 x 2208 像素,401 ppi,屏幕物理尺寸为 2.7 x 4.8 英寸或 68 x 122 毫米。在缩放模式下运行时,即在 iPhone 6 Plus 上没有新的 LaunchImages 或在设置中选择时,原生比例为 2.88,屏幕为 320 x 568 点,这是 iPhone 5 的原生尺寸:
Screen bounds: {{0, 0}, {414, 736}}, Screen resolution: <UIScreen: 0x7f97fad330b0; bounds = {{0, 0}, {414, 736}};
mode = <UIScreenMode: 0x7f97fae1ce00; size = 1242.000000 x 2208.000000>>, scale: 3.000000, nativeScale: 3.000000
iPhone 6 和 iPhone 6S 的尺寸,@2x 缩放(Apple 名称:Retina HD 4.7),坐标空间:375 x 667 点和 750 x 1334 像素,326 ppi,屏幕物理尺寸为 2.3 x 4.1 英寸或 58 x 104 毫米。在缩放模式下运行时,即没有新的 LaunchImages,屏幕为 320 x 568 点,这是 iPhone 5 的原生尺寸:
Screen bounds: {{0, 0}, {375, 667}}, Screen resolution: <UIScreen: 0x7fa01b5182d0; bounds = {{0, 0}, {375, 667}};
mode = <UIScreenMode: 0x7fa01b711760; size = 750.000000 x 1334.000000>>, scale: 2.000000, nativeScale: 2.000000
相比之下,iPhone 5 为 640 x 1136,iPhone 4 640 x 960。
这是我用来检查的代码(请注意,nativeScale 仅在 iOS 8 上运行):
UIScreen *mainScreen = [UIScreen mainScreen];
NSLog(@"Screen bounds: %@, Screen resolution: %@, scale: %f, nativeScale: %f",
NSStringFromCGRect(mainScreen.bounds), mainScreen.coordinateSpace, mainScreen.scale, mainScreen.nativeScale);
注意:上传 LaunchImage 否则应用程序将在缩放模式下运行,并且不会显示正确的缩放比例或屏幕尺寸。在缩放模式下,nativeScale
和 scale
将不一样。在实际设备上,iPhone 6 Plus 上的比例可以是 2.608,即使它没有在缩放模式下运行,但它会显示在模拟器上运行时的规模为 3.0。
https://i.stack.imgur.com/ANau4.jpg
真实/物理 iPhone 6 Plus 分辨率为 1920x1080,但在 Xcode 中,您将界面设置为 2208x1242 分辨率(736x414 点),并且在设备上它会自动缩小到 1920x1080 像素。
iPhone 分辨率快速参考:
Device Points Log. Res. Sc. Real Res. PPI Ratio Size
iPhone 12 Pro Max, 13 Pro Max 926x428 2778x1284 3x 2778x1284 458 19.5:9 6.7"
iPhone 12, 12 Pro, 13, 13 Pro 844x390 2532x1170 3x 2532x1170 460 19.5:9 6.1"
iPhone 12 mini, 13 mini 812x375 2436x1125 3x 2340x1080 476 19.5:9 5.4"
iPhone XS Max, 11 Pro Max 896x414 2688x1242 3x 2688x1242 458 19.5:9 6.5"
iPhone XR, 11 896x414 1792x828 2x 1792x828 326 19.5:9 6.1"
iPhone X, XS, 11 Pro 812x375 2436x1125 3x 2436x1125 458 19.5:9 5.8"
iPhone 6+, 6S+, 7+, 8+ 736x414 2208x1242 3x 1920x1080 401 16:9 5.5"
iPhone 6, 6S, 7, 8, SE2 667x375 1334x750 2x 1334x750 326 16:9 4.7"
iPhone 5, 5S, 5C, SE1 568x320 1136x640 2x 1136x640 326 16:9 4.0"
iPhone 4, 4S 480x320 960x640 2x 960x640 326 3:2 3.5"
iPhone 3GS 480x320 480x320 1x 480x320 163 3:2 3.5"
https://i.stack.imgur.com/0jwdF.png
您可能应该停止在 iOS 8 中使用启动图像并使用情节提要或 nib/xib。
在 Xcode 6 中,打开 File 菜单并选择 New ⟶ File... ⟶ iOS ⟶ User Interface ⟶ Launch Screen。
然后通过单击打开项目的设置。
在 General 选项卡的 App Icons and Launch Images 部分中,将 Launch Screen File 设置为您刚刚创建的文件(这将在 info.plist 中设置 UILaunchStoryboardName)。
请注意,模拟器暂时只会显示黑屏,所以需要在真机上进行测试。
将 Launch Screen xib 文件添加到您的项目中:
https://i.stack.imgur.com/DMbdY.png
将项目配置为使用 Launch Screen xib 文件而不是资产目录:
https://i.stack.imgur.com/TktZk.png
在物理设备上,iPhone 6 Plus 的主屏幕边界是 2208x1242,nativeBounds 是 1920x1080。调整到物理显示器的大小涉及到硬件缩放。
在模拟器上,iPhone 6 Plus 的主屏幕 bounds 和 nativeBounds 都是 2208x1242。
换句话说...视频、OpenGL 和其他基于 CALayers
的处理像素的东西将处理设备上的真实 1920x1080 帧缓冲区(或 2208x1242 模拟)。处理 UIKit
中的点的事物将处理 2208x1242 (x3) 边界并在设备上进行适当缩放。
模拟器无法访问在设备上进行缩放的相同硬件,并且在软件中模拟它并没有太大的好处,因为它们会产生与硬件不同的结果。因此,将模拟设备主屏幕的 nativeBounds
设置为物理设备主屏幕的边界是有意义的。
iOS 8 向 UIScreen
(nativeScale
和 nativeBounds
)添加了 API,让开发人员确定 UIScreen
对应的 CADisplay
的分辨率。
对于像我这样想知道如何处理遗留应用程序的人,我在这个主题上做了一些测试和计算。
感谢@hannes-sverrisson 的提示,我开始假设旧版应用程序在 iPhone 6 和 iPhone 6 plus 中使用 320x568 视图处理。
测试是使用带有白色边框的简单黑色背景 bg@2x.png
进行的。背景大小为 640x1136 像素,为黑色,内部白色边框为 1 像素。
下面是模拟器提供的截图:
iPhone 5 模拟器:http://i.stack.imgur.com/b2E5K.png
iPhone 6 模拟器:http://i.stack.imgur.com/4Qz8N.png
iPhone 6 plus 模拟器:http://i.stack.imgur.com/hQisc.png
在 iPhone 6 截图中,我们可以看到白色边框的顶部和底部有 1 个像素的边距,而在 iPhone 6 plus 截图上,我们可以看到 2 像素的边距。这在 iPhone 6 plus 上为我们提供了 1242x2204 的已用空间,而不是 1242x2208,在 iPhone 6 上为 750x1332,而不是 750x1334。
我们可以假设这些坏点是为了尊重 iPhone 5 的纵横比:
iPhone 5 640 / 1136 = 0.5634
iPhone 6 (used) 750 / 1332 = 0.5631
iPhone 6 (real) 750 / 1334 = 0.5622
iPhone 6 plus (used) 1242 / 2204 = 0.5635
iPhone 6 plus (real) 1242 / 2208 = 0.5625
其次,重要的是要知道@2x 资源不仅会在 iPhone 6 plus(预计 @3x 资产)上缩放,还会在 iPhone 6 上缩放。这可能是因为不缩放资源会导致意外的布局,因为到视图的放大。
但是,这种缩放在宽度和高度上并不相等。我尝试使用 264x264 @2x 资源。鉴于结果,我必须假设缩放比例与像素/点比成正比。
Device Width scale Computed width Screenshot width
iPhone 5 640 / 640 = 1.0 264 px
iPhone 6 750 / 640 = 1.171875 309.375 309 px
iPhone 6 plus 1242 / 640 = 1.940625 512.325 512 px
Device Height scale Computed height Screenshot height
iPhone 5 1136 / 1136 = 1.0 264 px
iPhone 6 1332 / 1136 = 1.172535 309.549 310 px
iPhone 6 plus 2204 / 1136 = 1.940141 512.197 512 px
重要的是要注意 iPhone 6 的缩放比例在宽度和高度 (309x310) 上是不同的。这往往印证了上述理论,即缩放不是宽度和高度成比例的,而是使用像素/点的比例。
我希望这有帮助。
查看此信息图:http://www.paintcodeapp.com/news/iphone-6-screens-demystified
它解释了旧 iPhone、iPhone 6 和 iPhone 6 Plus 之间的区别。您可以查看以点、渲染像素和物理像素为单位的屏幕尺寸比较。您还将在那里找到问题的答案:
iPhone 6 Plus - 配备高清视网膜显示屏。缩放因子为 3,然后图像从渲染的 2208 × 1242 像素缩小到 1920 × 1080 像素。缩小比例为 1920 / 2208 = 1080 / 1242 = 20 / 23。这意味着原始渲染中的每 23 个像素必须映射到 20 个物理像素。换句话说,图像被缩小到其原始大小的大约 87%。
更新:
上面提到的信息图有一个更新版本。它包含有关屏幕分辨率差异的更多详细信息,并且涵盖了迄今为止的所有 iPhone 型号,包括 4 英寸设备。
http://www.paintcodeapp.com/news/ultimate-guide-to-iphone-resolutions
即使我一般不喜欢 John Gruber 的 Daring Fireball 博客的语气,但他的 Larger iPhone Display Conjecture 非常值得一读。
他猜到了,但两种型号的分辨率(以点为单位)和以像素为单位的分辨率都完全正确,除了他(我也不)期望 Apple 构建更小分辨率的物理显示器并按比例缩小(详细信息在 @Tommy 的回答中)。
这一切的要点是,人们应该停止考虑像素,开始考虑点(这种情况已经有很长一段时间了,它不是最近的发明)以及由此产生的 UI 元素的物理尺寸。简而言之,两款新 iPhone 机型在这方面都有所改进,因为物理上大多数元素的尺寸保持不变,您可以在屏幕上放置更多元素(对于每个更大的屏幕,您可以放置更多元素)。
我只是有点失望,他们没有为更大的模型保留内部分辨率与实际屏幕分辨率 1:1 的映射。
[UIScreen mainScreen].bounds.size.height
在 iPhone 6+ 模拟器中在纵向时返回 736。这是 2208 值除以 3 的比例。宽度为 414。