ChatGPT解决这个技术问题 Extra ChatGPT

iPhone 6 Plus 分辨率混乱:Xcode 还是苹果网站?用于发展

苹果官网称分辨率为1080p:1920 x 1080

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

谁是对的?

https://i.stack.imgur.com/Sx7Ig.png

iPhone 6+ 的启动图像必须为 1242x2208 和 2208x1242。至少这使得应用程序在模拟器中正常工作(这在 HIG 中有记录)。我还没弄清楚为什么这与假定的物理屏幕尺寸 1920x1080 不同。
非常奇怪的差异。
这可能会在 Xcode 6.1 的稳定版本中发生变化。是吗?
要更新来自 Andreas 的链接,请参阅“iPhone 分辨率终极指南”paintcodeapp.com/news/ultimate-guide-to-iphone-resolutions

C
Community

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×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。
它与分辨率为 1242*2208 的 @3x 大小不完全相同,拉伸了 6%。
多么可怕的混搭!系统范围内的性能、内存和清晰度损失只是为了让一些 API 级别的大小调整稍微简单一些!好吧,我想当他们发布配备 5.5 英寸 461 ppi 显示屏的 iPhone 7 Plus 时,这一切都会变得有意义。
S
Sverrisson

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

https://i.stack.imgur.com/ANau4.jpg


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

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


6 plus,6s Plus 是 375 x 667,你的分辨率快速参考是错误的。
@dotrinh 我很确定它是正确的,375x667 是 iPhone 6(不是 6 plus)。
我调试并检查了这个 Apple 的页面。 developer.apple.com/library/archive/documentation/…
@dotrinh 非常有趣。我没有物理 iPhone 6Plus,但我很确定它一定是苹果页面和 ios 模拟器上的错误,如这里建议的 developer.apple.com/forums/thread/108906 。特别是在同一页面上,Apple 声明 6Plus 的原生比例因子为 2.608,与具有相同物理分辨率和大小以及 uikit 比例因子(1080/2.608=414 和 1920/2.608=736)的 7Plus 相同。因此,6Plus 的 UIKit 分辨率与 7Plus 不同是没有意义的。
E
Eneko Alonso

您可能应该停止在 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


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

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

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

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

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

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


P
Peter Mortensen

对于像我这样想知道如何处理遗留应用程序的人,我在这个主题上做了一些测试和计算。

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

我希望这有帮助。


C
Community

查看此信息图: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 英寸设备的信息。
r
rawpower

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

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

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

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


我们以点为单位思考,但不幸的是,我们必须在 Photoshop 上以像素为单位创建图像......😃
像素对我们许多人来说很重要,原因有很多。虽然 Apple 对此话题进行了自己的思想监管,但出于非常好的原因,他们不情愿地在 iOS8 中添加了 [UIScreen nativeBounds]。
是的,像素也很重要,但对于像图像(闪屏等)这样的静态资产。我的观点(双关语)是针对应用程序屏幕的布局,动态绘制的东西。