【问题标题】:iPhone 6+ screen dimension confusioniPhone 6+ 屏幕尺寸混乱
【发布时间】:2018-01-18 06:28:06
【问题描述】:

当打印 iPhone 6+ 模拟器的屏幕高度时,我得到了 2208,正如预期的那样。但是,当我在实际的 iPhone 6+ 上进行测试时,我得到了 1920。非常困惑哪个是正确的。这是我正在使用的代码:

func test() {
    if UIDevice().userInterfaceIdiom == .phone {
        switch UIScreen.main.nativeBounds.height {
        case 1136:
            print("iPhone 5 or 5S or 5C")
        case 1334:
            print("iPhone 6/6S/7/8")
        case 2208:
            print("iPhone 6+/6S+/7+/8+")
        case 2436:
            print("iPhone X")
        default:
            print("unknown")
        }
    }
}

【问题讨论】:

标签: ios iphone swift


【解决方案1】:

问题是所有 plus 设备都进行了下采样,因此要解决此问题,您需要测试两种不同的分辨率,一种用于模拟器 2208,另一种用于真实设备 1920,正如您在 answer 中看到的那样:

case 1920, 2208:

【讨论】:

  • 那么,在部署中,所有加大码的 iPhone 都将使用 1920 的高度? 2208这个数字只适用于plus模拟器?这有什么意义?
  • 这就是它的工作原理。 2208 是渲染大小,1920 是实际的物理像素数。所以在模拟器中它只是以渲染大小显示它,但在真实设备中它需要对图像进行下采样才能显示它。
【解决方案2】:

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

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

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

【讨论】:

  • 对。 bounds:“以点为单位”,nativeBounds :“以像素为单位”
  • 这并不能解释为什么 OP 在 iPhone 6+ 模拟器上得到 2208 而在真正的 iPhone 6+ 上得到 1920。
  • UIKit 和点不会是 2208x1242。这就是物理分辨率。除以比例得到分数。
猜你喜欢
  • 2015-01-31
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多