小编典典

如何检测 iPhone 5(宽屏设备)?

all

我刚刚升级到 Xcode 4.5 GM,发现您现在可以将 ‘4” Retina’ 尺寸应用到情节提要中的视图控制器。

现在,如果我想创建一个在 iPhone 4 和 5 上运行的应用程序,当然我必须构建每个窗口两次,但我还必须检测用户是否拥有 3.5” 或 4” 屏幕的
iPhone,然后应用看法。

我该怎么做?


阅读 94

收藏
2022-04-21

共1个答案

小编典典

首先,您不应该重建所有视图以适应新屏幕,也不应该为不同的屏幕尺寸使用不同的视图。

使用 iOS 的 自动调整大小 功能,您的视图可以调整和适应任何屏幕尺寸。

这不是很难,请阅读一些有关此的文档。它将为您节省大量时间。

iOS 6 还为此提供了新功能。
请务必阅读Apple Developer 网站上的iOS 6 API
更改日志。

并检查新的 iOS 6
AutoLayout
功能。

也就是说,如果你真的需要检测 iPhone
5,你可以简单地依靠屏幕大小

[ [ UIScreen mainScreen ] bounds ].size.height

iPhone 5 的屏幕高度为 568。
你可以想象一个宏来简化这一切:

#define IS_IPHONE_5 ( fabs( ( double )[ [ UIScreen mainScreen ] bounds ].size.height - ( double )568 ) < DBL_EPSILON )

fabs正如 H2CO3 在评论中指出的那样,在比较浮点时,使用epsilon 是为了防止精度错误。

因此,从现在开始,您可以在标准 if/else 语句中使用它:

if( IS_IPHONE_5 )
{}
else
{}

编辑 - 更好的检测

正如某些人所说,这仅 检测到宽屏 ,而不是实际的 iPhone 5。

下一个版本的 iPod touch 可能也会有这样的屏幕,所以我们可能会使用另一组宏。

让我们重命名原始宏IS_WIDESCREEN

#define IS_WIDESCREEN ( fabs( ( double )[ [ UIScreen mainScreen ] bounds ].size.height - ( double )568 ) < DBL_EPSILON )

让我们添加模型检测宏:

#define IS_IPHONE ( [ [ [ UIDevice currentDevice ] model ] isEqualToString: @"iPhone" ] )
#define IS_IPOD   ( [ [ [ UIDevice currentDevice ] model ] isEqualToString: @"iPod touch" ] )

这样,我们可以确保我们有一个 iPhone 型号 一个宽屏,我们可以重新定义IS_IPHONE_5宏:

#define IS_IPHONE_5 ( IS_IPHONE && IS_WIDESCREEN )

另请注意,正如@LearnCocos2D 所述,如果应用程序未针对 iPhone 5 屏幕进行优化(缺少 Default-568h@2x.png
图像),则此宏将不起作用,因为在这种情况下屏幕尺寸仍为 320x480一个案例。

我不认为这可能是一个问题,因为我不明白我们为什么要在未优化的应用程序中检测 iPhone 5。

重要 - iOS 8 支持

在 iOS 8 上,该类的bounds属性UIScreen现在反映了 设备方向
很明显,前面的代码不能开箱即用。

为了解决这个问题,您可以简单地使用新nativeBounds属性,而不是bounds,因为它不会随着方向而改变,并且它基于纵向模式。
请注意,尺寸nativeBounds以像素为单位,因此对于 iPhone 5,高度将是 1136 而不是 568。

如果您还针对 iOS 7 或更低版本,请务必使用功能检测,因为nativeBounds在 iOS 8 之前调用会导致您的应用崩溃:

if( [ [ UIScreen mainScreen ] respondsToSelector: @selector( nativeBounds ) ] )
{
    /* Detect using nativeBounds - iOS 8 and greater */
}
else
{
    /* Detect using bounds - iOS 7 and lower */
}

您可以通过以下方式调整以前的宏:

#define IS_WIDESCREEN_IOS7 ( fabs( ( double )[ [ UIScreen mainScreen ] bounds ].size.height - ( double )568 ) < DBL_EPSILON )
#define IS_WIDESCREEN_IOS8 ( fabs( ( double )[ [ UIScreen mainScreen ] nativeBounds ].size.height - ( double )1136 ) < DBL_EPSILON )
#define IS_WIDESCREEN      ( ( [ [ UIScreen mainScreen ] respondsToSelector: @selector( nativeBounds ) ] ) ? IS_WIDESCREEN_IOS8 : IS_WIDESCREEN_IOS7 )

显然,如果您需要检测 iPhone 6 或 6 Plus,请使用相应的屏幕尺寸。

2022-04-21