【问题标题】:iPhone 6 Plus resolution confusion: Xcode or Apple's website? for developmentiPhone 6 Plus 分辨率混乱:Xcode 还是苹果网站?用于发展
【发布时间】:2014-11-03 12:19:27
【问题描述】:

Apple 的网站声称分辨率为 1080p:1920 x 1080

但是,Xcode(今天推出的 8.0 GM)所需的启动屏幕是 2208 x 1242。

谁是对的?

【问题讨论】:

标签: ios xcode ios-simulator iphone-6 iphone-6-plus


【解决方案1】:

iPhone 6+ 在内部使用 @3x 资源以 2208×1242 的虚拟分辨率(具有 736x414 点)进行内部渲染,然后采样那下来展示。就像在 Retina MacBook 上使用缩放分辨率一样——它可以让它们达到像素资产的整数倍,同时仍然拥有例如12 pt 文本在屏幕上的大小相同。

所以,是的,启动屏幕需要是那个大小。

数学:

6、5s、5、4s 和 4 都是每英寸 326 像素,并使用 @2x 资源来坚持所有以前的设备每英寸大约 160 点。

6+ 是每英寸 401 像素。所以它假设大约需要@2.46x 资产。相反,Apple 使用 @3x 资产并将完整输出缩减到其自然大小的 84% 左右。

实际上,Apple 已决定采用 87% 左右的比例,将 1080 变成 1242。毫无疑问,这是为了找到尽可能接近 84% 的值,但仍能在两个方向上产生整数大小 — 1242/1080 = 2208 /1920 准确,而如果您将 1080 变成 1286,则需要以某种方式垂直渲染 2286.22 像素才能很好地缩放。

【讨论】:

  • 你是怎么计算出来的->“2208×1242的虚拟分辨率(736x414点)”和这个“大约需要@2.46x资产” UIScreen mainScreen].bounds.size.height 会返回 6+? 568、568*3 (1704) 或 1920。
  • 也许在这个答案中添加一个关于启动图像的注释? (请参阅 Hannes 的回答)对于正在升级的现有应用程序(否则它以 320x576 @3x 运行 - 我有一段时间感到困惑!)
  • @msk [UIScreen mainScreen].bounds.size.height 在 iPhone 6+ 模拟器中在纵向时返回 736。这是 2208 值除以 3 的比例。宽度为 414。
  • 与@3x 分辨率1242*2208的大小不完全相同,拉伸了6%。
  • 多么可怕的拼凑!系统范围的性能、内存和清晰度损失只是为了让一些 API 级别的大小调整稍微简单一些!好吧,我想当他们发布配备 5.5 英寸 461 ppi 显示屏的 iPhone 7 Plus 时,这一切都会变得有意义。
【解决方案2】:

答案是较旧的应用程序在 2208 x 1242 缩放模式下运行。但是,当为新手机构建应用程序时,可用的分辨率为:Super Retina HD 5.8 (iPhone X) 1125 x 2436 (458ppi)Retina HD 5.5iPhone 6、7、8 Plus) 1242 x 2208Retina 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" Liquid Retina 高清显示屏。

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" display),坐标空间: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

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 6iPhone 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 否则应用程序将在缩放模式下运行,并且不会显示正确的缩放比例或屏幕尺寸。在缩放模式下nativeScalescale 将不一样。 在实际设备上,iPhone 6 Plus 上的比例可以是 2.608,即使它没有在缩放模式下运行,但它会显示在模拟器上运行时的规模为 3.0。

【讨论】:

  • 我猜你没有添加新的启动映像版本。这可能就是为什么应用程序在“兼容模式”下运行并且两个设备上的屏幕边界都是旧的 320x576。
  • 添加新的启动图像尺寸后,您将获得正确的(逻辑)屏幕边界尺寸:iPhone 6 为 375x667,iPhone 6+ 为 414x736。
  • @DanielRinser 谢谢。我会试试看。
  • @DanielRinser 感谢您对启动图像的投入。我已根据您的输入更新了答案。
  • 那么 iPhone 4 的资产呢?如果没有插槽,它们应该如何命名以及如何将它们放在资产目录中?资产目录有 3 个用于 iPhone 图像的插槽:1x、2x 和 3x。如果 2x 和 3x 用于 iPhone 6 和 6+ 资产,我们是否将 iPhone 4 资产放在 1x 上?我不这么认为。
【解决方案3】:

真实/物理 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"

【讨论】:

    【解决方案4】:

    您可能应该停止在 iOS 8 中使用启动图像并使用情节提要或 nib/xib。

    • Xcode 6 中,打开 File 菜单并选择 NewFile...iOSUser InterfaceLaunch Screen

    • 然后通过单击打开项目的设置

    • General 选项卡中,在名为App Icons and Launch Images 的部分中,将Launch Screen File 设置为您刚刚创建的文件(这会将UILaunchStoryboardName 设置为info.plist)。

    请注意,模拟器暂时只会显示黑屏,所以需要在真机上测试

    将启动屏幕 xib 文件添加到您的项目:

    将您的项目配置为使用启动屏幕 xib 文件而不是资产目录:

    【讨论】:

    • 近乎完美的指令,但应该是 File -> NEW -> File... etc 花了一段时间才找到第二个文件 :) 感谢您的帮助!
    • 如何让这些看起来不错?当我尝试在其上放置图像时,它会变得非常不稳定。
    • 如果您不只是显示图像并且希望显示 UI 以进行加载,那么这是一个好主意,因为无论图像是否在故事板与否。同样,如果您可以在代码中绘制图像,那么您可以绕过我想的那样。
    • 如果您支持 iOS 8 之前的任何内容,您仍然需要提供图像文件,因为启动 xib 不向后兼容。
    【解决方案5】:

    在物理设备上,iPhone 6 Plus 的主屏幕边界是 2208x1242,nativeBounds 是 1920x1080。调整到物理显示器的大小涉及到硬件缩放。

    在模拟器上,iPhone 6 Plus 的主屏幕 bounds 和 nativeBounds 都是 2208x1242。

    换句话说...基于CALayers 处理像素的视频、OpenGL 和其他东西将处理设备上真正的 1920x1080 帧缓冲区(或 2208x1242 在 sim 上)。处理UIKit 中的点的事物将处理 2208x1242 (x3) 边界并在设备上进行适当缩放。

    模拟器无法访问在设备上进行缩放的相同硬件,并且在软件中模拟它并没有太大的好处,因为它们会产生与硬件不同的结果。因此,将模拟设备主屏幕的nativeBounds 设置为物理设备主屏幕的边界是有意义的。

    iOS 8 为UIScreennativeScalenativeBounds)添加了API,让开发者确定CADisplay 对应UIScreen 的分辨率。

    【讨论】:

      【解决方案6】:

      对于像我这样想知道如何处理旧版应用程序的人,我对此主题进行了一些测试和计算。

      感谢@hannes-sverrisson 的提示,我开始假设旧版应用程序在 iPhone 6 和 iPhone 6 plus 中使用 320x568 视图处理。

      测试是使用带有白色边框的简单黑色背景bg@2x.png 进行的。背景大小为 640x1136 像素,为黑色,内部白色边框为 1 像素。

      以下是模拟器提供的截图:

      在 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)。这往往印证了上述理论,即缩放不是宽度和高度成比例的,而是使用像素/点的比例。

      我希望这会有所帮助。

      【讨论】:

        【解决方案7】:

        查看此信息图: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

        【讨论】:

        • 所以即使关闭了抗锯齿功能,在缩小比例时也会出现非可选的抗锯齿功能?
        • 如果该信息图包含 4 英寸屏幕,那就太棒了。
        • @Rajesh 我已经更新了我的答案,现在查看有关 4 英寸设备的信息。
        【解决方案8】:

        即使我一般不喜欢 John Gruber 的 Daring Fireball 博客的语气,他的 Larger iPhone Display Conjecture 也值得一读。

        他猜对了,但完全正确对这两种型号的分辨率(以点和像素为单位)表示正确,但他并不(我也不)期望 Apple 会构建更小分辨率的物理显示器并缩小尺寸(详细信息在@Tommy 的回答中)。

        这一切的要点是,人们应该停止考虑像素,开始考虑点(这种情况已经有很长一段时间了,这不是最近的发明)以及由此产生的 UI 元素的物理尺寸。简而言之,两款新 iPhone 机型在这方面都有所改进,因为物理上大多数元素的大小保持不变,您可以在屏幕上放置更多元素(对于每个更大的屏幕,您可以放置​​更多元素)。

        我只是有点失望,他们没有为更大的模型保留内部分辨率与实际屏幕分辨率 1:1 的映射。

        【讨论】:

        • 我们以点为单位思考,但不幸的是,我们必须在 Photoshop 上以像素为单位创建图像...?
        • 像素对我们许多人来说很重要,原因有很多。虽然 Apple 对此主题进行了自己的思想监管,但出于非常好的原因,他们不情愿地在 iOS8 中添加了 [UIScreen nativeBounds]。
        • 是的,像素也很重要,但对于图像(闪屏等)等静态资源而言。我的观点(双关语)是为了应用程序屏幕的布局,动态绘制的东西。
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多