【问题标题】:iPhone physical size determination including future devices...?iPhone物理尺寸确定,包括未来的设备......?
【发布时间】:2015-07-11 11:12:38
【问题描述】:

有人知道通过代码确定 iPhone 的物理尺寸(以英寸为单位)的方法吗?

我们希望在 iPhone 6+ 和任何未来至少一样大的设备上拥有稍微不同的 UI。复杂之处在于它们在非原生模式下运行,因此 6+、6 和 5 的屏幕边界始终为 320x568 单位。

据我所知,没有办法做到这一点(也许这是苹果有意识的决定)?

我可以通过其设备名称 (iPhone7,1) 识别 iPhone 6+,这目前很好,但我只能猜测如何识别未来的设备。例如,如果有一个 iPhone 7+ 的设备名称为“iPhone8,1”,它会和 6+ 一样大吗?

理想情况下,我只需询问设备的尺寸(高度/宽度)(以英寸为单位),然后使用它来决定使用哪个 UI。或者,如果我有 dpi,我可以从中计算出英寸。

我不能为此使用新的尺寸等级,因为我们在纵向 UI 中执行此操作,并且 5、6、6+ 在该方向上都是“紧凑的”...

可能有各种“技巧”,但这些似乎不可靠。这包括假设 nativeScale >= 3 或横向尺寸 class== "regular" ==> iPhone 6+ 或更大。

就目前的情况而言,对于代码无法识别的任何未来设备,我们可能不得不默认使用我们的 5 / 6 UI(直到我们可以进行更新)...

有什么想法吗?

相关链接:

iOS Different Font Sizes within Single Size Class for Different Devices

【问题讨论】:

  • 可以通过调用 [[UIScreen mainScreen] scale] 来确定 DPI,但它返回一个整数...
  • 总之,作为一名 Apple 开发人员,您有足够的注意来调查 SDK 测试版的规模/密度/外形问题......
  • 因此,对于当前设备,iPhone 5 和 iPhone 6(以及 iPhone 4S)的 scale 将返回 2。在我们的例子中,它也会为 iPhone 6+ 返回 2,因为我们没有在原生模式下运行(6 和 6+ 基本上是放大的 iPhone 5)。我相信 nativeScale 会为 iPhone 6+ 返回 3(即使在非本地模式下甚至在模拟器中),但假设未来的 @3x 设备与 iPhone 6+ 一样大似乎不可靠...... :(跨度>
  • 我们也处于一个有点独特的情况,我们发布了 400 多个 (!) 应用程序并且还在增加。因此,必须重新发布所有这些以支持新设备是有问题的。我们正在考虑的一种方法是基本上将设备信息移动到服务器上,这样我们就可以在新设备推出时对其进行更新,而无需重新发布应用程序...

标签: ios objective-c iphone iphone-6-plus


【解决方案1】:

我在我的 pch 文件中使用此代码:

#define IS_IPAD ([[UIDevice currentDevice] userInterfaceIdiom] == UIUserInterfaceIdiomPad)
#define IS_IPHONE6PLUS (!IS_IPAD && [[UIScreen mainScreen] bounds].size.height >= 736)
#define IS_IPHONE6 (!IS_IPAD && !IS_PHONE6PLUS && [[UIScreen mainScreen] bounds].size.height >= 667)
#define IS_IPHONE5 (!IS_IPAD && !IS_PHONE6PLUS && !IS_IPHONE6 && ([[UIScreen mainScreen] bounds].size.height >= 568))

然后在你的代码中你可以问

if (IS_IPHONE6PLUS) {
    // do something
}

NSStringFromCGRect([[UIScreen mainScreen] bounds]) 的输出是 {{0, 0}, {414, 736}}

【讨论】:

  • 不幸的是,这对我们的情况没有帮助,因为(如上所述)我们在非本机模式下运行,所以 5、6、6+ 对我们来说都是 320x568 设备。您的 IS_IPHONE6PLUS 和 IS_IPHONE6 宏对我们不起作用(将始终评估为 FALSE),并且您的 IS_IPHONE5 宏将评估为 TRUE,但 4S 或更小。
  • 我想我还认为您的方法与使用 name=iPhone7,1 等来识别设备存在相同的问题,因为它可能会在未来的设备上失败。这可能不太可能,但如果 iPhone 7+(如果有的话)最终的高度
  • 是的,没错。因为 ios 8 size classes 和 layoutconstraints 是更好的方法。但我不太明白:如果你在非原生模式下运行应用程序,为什么你需要知道屏幕是否更大?
  • 在更大的屏幕上(现在是 iPhone 6+),我们在一些表格视图中插入一个额外的列,并使用较小的字体大小,这仍然非常易读。在较小的屏幕上(iPhone 6 和现在更小),6+ 的 UI 很难阅读(相反,如果我们将 6/5 的 UI 放在 6+ 上,它看起来太大了)。
【解决方案2】:

确定 iPhone 的物理尺寸(以英寸为单位)

这永远不可能,因为物理屏幕是由 像素(方形 LED)组成的,无法询问其中一个的大小。

因此,例如,显示尺子(英寸/厘米)的应用程序需要以其他方式了解像素数与屏幕物理尺寸的关系 - 例如,通过在内置表格中查找。正如您所说的那样,如果引入了新设备,则该应用程序将在该表中没有条目,并且无法提供正确缩放的标尺。

【讨论】:

  • 这似乎值得怀疑,但我希望有一些 API 调用可以为我们返回此信息。所以,在 6 英寸上,我会得到 2.3 英寸的宽度。或者,如果我可以返回 ppi=326 和水平像素=750,那么我可以进行数学运算(750p/326ppi = 2.3 英寸)。
  • 我理解您的期望,我的答复是没有这样的 API。如果您有令人信服的用例,请向 Apple 提交增强请求!
  • 我主要是对您的“这永远不可能......”评论做出反应。这是完全可能的(并且不需要知道像素的大小) - 如果 API 要公开必要的信息。
  • 曝光?这假定 API具有 必要的信息。但软件并不一定了解外部硬件。
  • 我认为我们意见一致。为此,Apple 必须使软件能够从硬件(例如,从桌子或其他东西)获取此信息。我很确定 Android 设备有一个 API,因为那里有很多不同的设备。即使只是听到您确认这对 iOS 来说是不可能的也很有用——谢谢!
猜你喜欢
  • 1970-01-01
  • 2012-09-07
  • 1970-01-01
  • 1970-01-01
  • 2016-10-17
  • 1970-01-01
  • 2019-02-24
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多