为啥我的应用在 iPhone 12 mini 上显示的尺寸不正确?

Posted

技术标签:

【中文标题】为啥我的应用在 iPhone 12 mini 上显示的尺寸不正确?【英文标题】:why is my app's display on iPhone12 mini incorrectly sized?为什么我的应用在 iPhone 12 mini 上显示的尺寸不正确? 【发布时间】:2020-12-23 16:42:09 【问题描述】:

我读取手机的原始高度来确定我的显示输出大小,并确定顶部和底部的禁区。这是一个基于标签的应用程序。我的显示纯粹是程序化的,它仅基于屏幕尺寸以图形方式布局。在 iPhone 12 mini 上,显示屏比应有的小。其他 iPhone 12 类型显示正确。

在 xcode 模拟器中在各种 iPhone 类型上测试我的新应用时,他们 看起来正确。但是当我将应用程序放在我的 iPhone 12 mini 上时,显示屏比应有的要小。 我了解到模拟器返回的原始高度值为 2436,但手机返回的值为 2340。 此代码检查显示并告诉我按手机类型在屏幕顶部和底部保留多少:

nativeHeight=UIScreen.main.nativeBounds.height
    if nativeHeight==1136 || nativeHeight==1334             // SE,6S,7,8
        reserveTopPixels=40; reserveBottomPixels=98
    else if nativeHeight==1792                              // 11, XR
        reserveTopPixels=88; reserveBottomPixels=198
    else if nativeHeight==2208                              // 6s+ 7+ 8+
        reserveTopPixels=54; reserveBottomPixels=146
    else if nativeHeight==2436 || nativeHeight==2688        // X, XS, 11Pro, 11, Xr
        reserveTopPixels=132; reserveBottomPixels=260
    else if nativeHeight==2340 //iPhone 12 mini "downsampled screen"
        reserveTopPixels=132; reserveBottomPixels=260; nativeHeight = 2436
    else if nativeHeight==2532                              // 12, 12 pro
        reserveTopPixels=132; reserveBottomPixels=260
    else if nativeHeight==2778                              // 12 pro max
        reserveTopPixels=132; reserveBottomPixels=260
    else reserveTopPixels=40; reserveBottomPixels=98

我的修正是将手机收到的值 2340 改为更大的值 2436。

应用程序现在可以在模拟器和手机上正确显示。我的问题是,这是一个合理的解决方案,还是我应该尝试其他方法。

【问题讨论】:

iPhone 12 Mini 显示屏为 2340 x 1080,但标准比例屏幕截图为 2436 x 1125(原始分辨率)。在 12 Mini 上运行的软件将显示器“视为”为 2436 x 1125,但所有内容都在运行中被降采样到 2340 x 1080。2436 x 1125 是 12 Mini 显示器的软件界面尺寸。在您的代码中,您应该使用本机分辨率。 参考:daringfireball.net/2020/11/…useyourloaf.com/blog/iphone-12-screen-sizes Haris,当我通过手机尺寸调整步骤在手机上单步执行应用程序时,手机返回值 2340。这就是为什么在上面的代码中我必须将值更改为 2436。如果我使用返回的值 2340,然后我的显示器尺寸有点小,看起来不正确。如果我使用修改后的值,如上所示,则显示的大小适合屏幕。 更简洁地说,手机应该返回2436的高度,模拟器返回2436的高度,所以运行模拟器的代码正确显示。但是手机实际上返回了 2340 的高度,一个应用程序会读取该高度并生成该尺寸的显示,但它会因缩小而运行,因此它看起来比模拟器上的相同显示要小。我上面的代码试图解决这个问题,我问它是否是一个好的解决方法。如果手机更新并返回值 2436,我的解决方法仍然很好。 也许这会对你有所帮助 -> ***.com/questions/21668497/… 【参考方案1】:

nativeBounds:CGRect。 :提供物理屏幕的边界矩形,以像素为单位。 iPhone 12 mini的物理屏幕为1080×2340像素

iPhone 12 mini 的物理屏幕分辨率为 1080 x 2340 像素 (476 ppi)。这低于操作系统报告的本机分辨率(使用 UIScreen 上的 nativeBounds)。我认为这是为了保持与 5.8 英寸机型(iPhone X/XS/11 Pro)分辨率的兼容性。

参考:

https://hacknicity.medium.com/how-ios-apps-adapt-to-the-various-iphone-12-screen-sizes-e45c021e1b8b https://useyourloaf.com/blog/iphone-12-screen-sizes/

这取决于你在哪里使用这个 nativeHeight 来布局。

【讨论】:

Nandish,手机报告的本机高度为 2340。请参见上面的代码。 Nandish,我在绘制我的显示器时使用这个原生高度,它是通过编程完成的。所以这一切都与给定的尺寸成正比,当我从手机上得到错误的高度时,太短了,我的显示器看起来不对(有点跑)【参考方案2】:

正如您所指出的,您在 iPhone 12 mini 模拟器上遇到了问题。那你为什么需要所有的检查逻辑?只要确保您在模拟器上工作并抓住 iPhone 12 mini 并进行调整即可。我认为这个扩展是有意义的。

static var isSimulator: Bool 
    return TARGET_OS_SIMULATOR != 0


extension UIDevice 
    var modelIdentifier = ""
    modelIdentifier = ProcessInfo.processInfo.environment["SIMULATOR_MODEL_IDENTIFIER"] ?? ""
    let nativeHeight = UIScreen.main.nativeBounds.height
    if nativeHeight==2340 // your specific case
    
    reserveTopPixels=132; reserveBottomPixels=260; nativeHeight = 2436
    


编辑

那么如果您希望某些代码仅在 iOS 模拟器任一设备上运行,您应该使用这个:

func adjust() 
#if targetEnvironment(simulator)
    // we're on the simulator 
    
#else
    // we're on a device
    
#endif

【讨论】:

谢谢,在我看来模拟器已经正常工作了,它返回的值是 2436,而手机返回的值是 2340,我认为这是不正确的。无论如何,我需要紧密构建的应用程序显示来匹配模拟器和真实项目。我的解决方法是这样做的,但我不希望由于该解决方法而出现其他问题。显示的代码必须适用于所有 iPhone 或模拟器。

以上是关于为啥我的应用在 iPhone 12 mini 上显示的尺寸不正确?的主要内容,如果未能解决你的问题,请参考以下文章

iPhone 应用程序启动图像未显示在 iPad mini 中

iPhone 12 mini 硬件规格

在 iPad mini 中使用语音听写时 100% iPhone 应用程序崩溃

React Native 区分 iPhone 11 Pro 和 iPhone 12 Mini

苹果客服回应“iPhone12Mini停产”传闻

iPhone 13(Pro、Max、Mini)和旧款 iPhone 的所有媒体查询