为啥我的应用在 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 中
在 iPad mini 中使用语音听写时 100% iPhone 应用程序崩溃