为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

iOS
手掌心 2019-06-13 19:17:55
如何检测iPhone 5(宽屏设备)?我刚刚升级到XCode4.5GM,并发现您现在可以将‘4“Retina大小应用于您的故事板视图控制器。现在,如果我想创建一个运行在iPhone 4和iPhone 5上的应用程序,当然,我必须构建每个窗口两次,但我还必须检测用户是否有一个3.5“或4”屏幕的iPhone,然后应用该视图。我该怎么做?
查看完整描述

3 回答

?
白猪掌柜的

TA贡献1893条经验 获得超10个赞

首先,您不应该重新构建所有视图以适应新屏幕,也不应该对不同的屏幕大小使用不同的视图。

使用自动调整iOS的功能,使您的视图可以调整,并调整任何屏幕大小。

这不是很难,读一些文件关于那件事。这会帮你节省很多时间。

iOS 6还提供了这方面的新功能。
请务必阅读iOS 6 API更改量g苹果开发者的网站上。
检查新的iOS 6AutoLayout能力。

也就是说,如果您真的需要检测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和epsilon在这里是为了防止精度错误,当比较浮点时,就像H2CO3的注释中指出的那样。

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

if( IS_IPHONE_5 ){}else{}

编辑-更好的检测

正如一些人所说,这只会起作用。探测宽屏而不是真正的iPhone 5。

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

让我们重命名原来的宏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屏幕进行优化(缺少默认的-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,请使用相应的屏幕大小。


查看完整回答
反对 回复 2019-06-13
?
SMILET

TA贡献1796条经验 获得超4个赞

真正简单的解决方案

if(UI_USER_INTERFACE_IDIOM() == UIUserInterfaceIdiomPhone){
    CGSize result = [[UIScreen mainScreen] bounds].size;
    if(result.height == 480)
    {
        // iPhone Classic
    }
    if(result.height == 568)
    {
        // iPhone 5
    }}


查看完整回答
反对 回复 2019-06-13
  • 3 回答
  • 0 关注
  • 482 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信