Ios iPhone物理尺寸确定,包括未来设备。。。?

Ios iPhone物理尺寸确定,包括未来设备。。。?,ios,objective-c,iphone,iphone-6-plus,Ios,Objective C,Iphone,Iphone 6 Plus,短期 有人知道通过代码来确定iPhone的物理尺寸(以英寸为单位)的方法吗 我们希望在iPhone6+和任何未来的设备上都有一个稍微不同的UI,至少有这么大。复杂的是,它们在非本机模式下运行,因此6+、6和5的屏幕边界始终为320x568个单位 Long 据我所知,没有办法做到这一点(也许这是苹果有意识的决定) 我可以通过它的设备名(iPhone7,1)来识别iPhone6+,目前还可以,但我只能猜测如何识别未来的设备。例如,如果有一个iPhone7+会有一个设备名“iPhone8,1”,它会和

短期

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

我们希望在iPhone6+和任何未来的设备上都有一个稍微不同的UI,至少有这么大。复杂的是,它们在非本机模式下运行,因此6+、6和5的屏幕边界始终为320x568个单位

Long

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

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

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

我不能用新的尺寸类来做这件事,因为我们在一个人像界面上做这件事,而5,6,6+在这个方向上都是“紧凑的”

有各种各样的“把戏”可能奏效,但这些似乎不可靠。这包括假设nativeScale>=3或横向尺寸等级==“常规”=>iPhone6+或更大

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

有什么想法吗

相关链接:

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

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


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

我在我的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},{414736}

通过调用[[UIScreen mainScreen]scale]来确定DPI是完全可能的,但它返回一个整数……其长短是作为一个苹果开发者,你有足够的时间来研究SDK测试版的比例/密度/形状因子问题……因此对于当前的设备,iPhone 5和iPhone 6(以及iPhone 4S)的比例将返回2。在我们的例子中,iphone6+也会返回2,因为我们不是在原生模式下运行(6和6+基本上是按比例放大的iphone5)。我相信对于iPhone 6+,nativeScale会返回3(即使在非本机模式下,甚至在模拟器中),但假设未来的设备具有@3x的功能,与iPhone 6+一样大,这似乎是不可靠的…:(我们也处在一个有点独特的情况下,我们有400+(!)应用程序发布和计数。因此,必须重新发布所有这些以支持新设备是有问题的。我们正在考虑的一种方法是基本上将设备信息移动到服务器上,以便我们可以在新设备出现时更新这些信息,而无需重新发布应用程序…这似乎值得怀疑,但我希望有一些API调用t将为我们返回此信息。因此,在6上,我将返回2.3英寸的宽度。或者,如果我可以返回ppi=326和水平像素=750,那么我可以进行计算(750p/326ppi=2.3英寸)。我理解你的期望,我的回答是没有这样的API。如果你有一个引人注目的用例,请向苹果提交一个增强请求!我主要是对你的“这永远不可能…”评论作出反应。这是完全可能的(不需要知道像素的大小)-如果API要公开必要的信息。公开?这假设API拥有必要的信息。但是软件不一定知道任何关于外部硬件的信息。我想我们是一致的。为了让这一切起作用,苹果必须让软件能够从硬件获取这些信息(例如,从表格或其他地方)。我很确定Android设备有一个API用于此,因为有这么多不同的设备。即使只是听到你确认这对iOS不可能是有用的——谢谢!不幸的是,这对我们的情况没有帮助,因为(如上所述)我们在非本机模式下运行,因此5、6、6+都是我们的320x568设备。您的IS_IPHONE6PLUS和IS_IPHONE6宏不适用于我们(将始终计算为FALSE)你的IS_IPHONE5宏对4S或更小的设备都会评估为真。我想我还认为你的方法与使用name=iPhone7,1等来识别设备存在相同的问题,因为它可能会在未来的设备上失败。这可能不太可能,但如果iPhone7+(如果有)会怎么样最终高度小于736。我认为如果可能的话,最好在这里使用尺寸等级(尽管5、6、6+在纵向上都是“规则”高度——6+在横向上只是宽度不同,5、6的“规则”与“紧凑”)…是的,没错。因为ios 8大小类和layyoutconstraints是更好的方法。但我不太明白的是:如果你在非本机模式下运行应用程序,为什么你需要知道屏幕是否更大?在更大的屏幕上(目前的iPhone 6+)我们在一些表视图中插入了一个额外的列,并使用较小的字体大小,这仍然是非常可读的。在较小的屏幕上(现在是iPhone 6或更小),6+UI很难阅读(相反,如果我们将6/5 UI放在6+上,它看起来太大)。