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

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

我刚刚升级到XCode4.5GM,并发现您现在可以将‘4“Retina大小应用于您的故事板视图控制器。

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

我该怎么做?


手掌心
浏览 483回答 3
3回答

白猪掌柜的

首先,您不应该重新构建所有视图以适应新屏幕,也不应该对不同的屏幕大小使用不同的视图。使用自动调整iOS的功能,使您的视图可以调整,并调整任何屏幕大小。这不是很难,读一些文件关于那件事。这会帮你节省很多时间。iOS 6还提供了这方面的新功能。请务必阅读iOS 6 API更改量g苹果开发者的网站上。检查新的iOS 6AutoLayout能力。也就是说,如果您真的需要检测iphone 5,您只需依赖于屏幕尺寸.[&nbsp;[&nbsp;UIScreen&nbsp;mainScreen&nbsp;]&nbsp;bounds&nbsp;].size.heightiPhone 5的屏幕高度为568。您可以想象一个宏,以简化所有这些:#define&nbsp;IS_IPHONE_5&nbsp;(&nbsp;fabs(&nbsp;(&nbsp;double&nbsp;)[&nbsp;[&nbsp;UIScreen&nbsp;mainScreen&nbsp;]&nbsp;bounds&nbsp;].size.height&nbsp;-&nbsp;(&nbsp;double&nbsp;)568&nbsp;)&nbsp;<&nbsp;DBL_EPSILON&nbsp;)使用fabs和epsilon在这里是为了防止精度错误,当比较浮点时,就像H2CO3的注释中指出的那样。因此,从现在开始,您可以在标准if/etc语句中使用它:if(&nbsp;IS_IPHONE_5&nbsp;){}else{}编辑-更好的检测正如一些人所说,这只会起作用。探测宽屏而不是真正的iPhone 5。下一个版本的iPodtouch可能也会有这样的屏幕,所以我们可以使用另一组宏。让我们重命名原来的宏IS_WIDESCREEN:#define&nbsp;IS_WIDESCREEN&nbsp;(&nbsp;fabs(&nbsp;(&nbsp;double&nbsp;)[&nbsp;[&nbsp;UIScreen&nbsp;mainScreen&nbsp;]&nbsp;bounds&nbsp;].size.height&nbsp;-&nbsp;(&nbsp;double&nbsp;)568&nbsp;)&nbsp;<&nbsp;DBL_EPSILON&nbsp;)让我们添加模型检测宏:#define&nbsp;IS_IPHONE&nbsp;(&nbsp;[&nbsp;[&nbsp;[&nbsp;UIDevice&nbsp;currentDevice&nbsp;]&nbsp;model&nbsp;]&nbsp;isEqualToString:&nbsp;@"iPhone"&nbsp;]&nbsp;)#define&nbsp;IS_IPOD&nbsp;&nbsp; &nbsp;(&nbsp;[&nbsp;[&nbsp;[&nbsp;UIDevice&nbsp;currentDevice&nbsp;]&nbsp;model&nbsp;]&nbsp;isEqualToString:&nbsp;@"iPod&nbsp;touch"&nbsp;]&nbsp;)这样,我们就可以确保我们有iPhone型号和宽屏,我们可以重新定义IS_IPHONE_5宏:#define&nbsp;IS_IPHONE_5&nbsp;(&nbsp;IS_IPHONE&nbsp;&&&nbsp;IS_WIDESCREEN&nbsp;)还请注意,正如@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(&nbsp;[&nbsp;[&nbsp;UIScreen&nbsp;mainScreen&nbsp;]&nbsp;respondsToSelector:&nbsp;@selector(&nbsp;nativeBounds&nbsp;)&nbsp;]&nbsp;){ &nbsp;&nbsp;&nbsp;&nbsp;/*&nbsp;Detect&nbsp;using&nbsp;nativeBounds&nbsp;-&nbsp;iOS&nbsp;8&nbsp;and&nbsp;greater&nbsp;*/}else{ &nbsp;&nbsp;&nbsp;&nbsp;/*&nbsp;Detect&nbsp;using&nbsp;bounds&nbsp;-&nbsp;iOS&nbsp;7&nbsp;and&nbsp;lower&nbsp;*/}您可以通过以下方式调整以前的宏:#define&nbsp;IS_WIDESCREEN_IOS7&nbsp;(&nbsp;fabs(&nbsp;(&nbsp;double&nbsp;)[&nbsp;[&nbsp;UIScreen&nbsp;mainScreen&nbsp;]&nbsp;bounds&nbsp;].size.height&nbsp;-&nbsp;(&nbsp;double&nbsp;)568&nbsp;)&nbsp;<&nbsp;DBL_EPSILON&nbsp;) #define&nbsp;IS_WIDESCREEN_IOS8&nbsp;(&nbsp;fabs(&nbsp;(&nbsp;double&nbsp;)[&nbsp;[&nbsp;UIScreen&nbsp;mainScreen&nbsp;]&nbsp;nativeBounds&nbsp;].size.height&nbsp;-&nbsp;(&nbsp;double&nbsp;)1136&nbsp;)&nbsp; <&nbsp;DBL_EPSILON&nbsp;)#define&nbsp;IS_WIDESCREEN&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;(&nbsp;(&nbsp;[&nbsp;[&nbsp;UIScreen&nbsp;mainScreen&nbsp;]&nbsp;respondsToSelector:&nbsp;@selector(&nbsp;nativeBounds&nbsp;)&nbsp;]&nbsp;)&nbsp; ?&nbsp;IS_WIDESCREEN_IOS8&nbsp;:&nbsp;IS_WIDESCREEN_IOS7&nbsp;)显然,如果您需要检测到iPhone 6或6 Plus,请使用相应的屏幕大小。

SMILET

真正简单的解决方案if(UI_USER_INTERFACE_IDIOM()&nbsp;==&nbsp;UIUserInterfaceIdiomPhone){ &nbsp;&nbsp;&nbsp;&nbsp;CGSize&nbsp;result&nbsp;=&nbsp;[[UIScreen&nbsp;mainScreen]&nbsp;bounds].size; &nbsp;&nbsp;&nbsp;&nbsp;if(result.height&nbsp;==&nbsp;480) &nbsp;&nbsp;&nbsp;&nbsp;{ &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//&nbsp;iPhone&nbsp;Classic &nbsp;&nbsp;&nbsp;&nbsp;} &nbsp;&nbsp;&nbsp;&nbsp;if(result.height&nbsp;==&nbsp;568) &nbsp;&nbsp;&nbsp;&nbsp;{ &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//&nbsp;iPhone&nbsp;5 &nbsp;&nbsp;&nbsp;&nbsp;}}
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

iOS