Objective-C宏检查设备

时间:2013-03-13 16:39:57

标签: ios objective-c macros c-preprocessor

我需要一个宏来确定该设备是iPhone 4还是iPhone 5.我被告知有一个宏可以做到这一点。有谁知道它是什么或我在哪里可以找到它?

4 个答案:

答案 0 :(得分:2)

我发现了一个可以解决问题的方法

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

答案 1 :(得分:2)

不幸的是,不仅没有宏,甚至没有公共API调用将设备类型返回到可以区分不同版本的iPhone(例如iPhone 4和iPhone5)之类的程度。 / p>

设备检测

您可以使用UI_USER_INTERFACE_IDIOM宏来确定用户是在iPhone / iPod还是iPad上运行:

if (UI_USER_INTERFACE_IDIOM() == UIUserInterfaceIdiomPad) {
     // The device is an iPad running iOS 3.2 or later.
}
else {
     // The device is an iPhone or iPod touch.
}

取自Advanced App TricksiOS App Programming Guide部分。

屏幕尺寸检测

关于支持多种屏幕尺寸以及特别是iPhone 4和iPhone 5,iOS应用程序编程指南指出:

  
    

要正确支持代码中较大的屏幕,请不要对当前设备的屏幕大小进行假设。相反,始终动态检索屏幕,窗口或视图的大小,并使用该大小信息来配置您的界面。您还应该使用基于视图的约束来构建用户界面,这样可以更轻松地在运行时管理视图层次结构的更改。

  

iOS版本检测

如果不是您要检测的屏幕尺寸,而是用户正在运行的iOS版本,Apple建议检查特定功能并使用后备(如果不可用)。再次,取自iOS应用程序编程指南:

  
    
        
  • 要确定某个方法是否在现有类上可用,请使用instancesRespondToSelector:class方法或respondsToSelector:instance方法。

  •     
  • 链接iOS SDK 4.2及更高版本的应用可以使用该版SDK中引入的弱链接支持。此支持允许您检查是否存在给定的Class对象,以确定是否可以使用该类。

  •     
  • 链接iOS SDK 4.1及更早版本的应用必须使用NSClassFromString函数来查看是否已定义类。如果函数返回的值不是nil,则可以使用该类。

  •     
  • 要确定基于C的函数是否可用,请执行函数名称与NULL的布尔比较。如果符号不是NULL,则可以使用该函数。

  •     
  

最后,yasirmturk提供了一系列便利宏here,用于检查用户正在运行的iOS版本。

答案 2 :(得分:1)

这就是我的所作所为:

if(UI_USER_INTERFACE_IDIOM() == UIUserInterfaceIdiomPad) {
    // iPad
} else {
    if (CGRectGetHeight([UIScreen mainScreen].bounds) >= 568.0) {
        // 4 inch - iPhone 5 or the new iPod touch
    }
    else {
        // 3,5 inch - iPhone 4S and older
    }
}

答案 3 :(得分:0)

我在UIDevice上创建了一个类别来实现它。非常简单的实现,但代码是

.h

#import <UIKit/UIKit.h>

@interface UIDevice (Recognition)

- (BOOL)isDeviceiPhone5;

@end

.m     #import“UIDevice + Recognition.h”

@implementation UIDevice (Recognition)

- (BOOL)isDeviceiPhone5
{
    return ([UIScreen mainScreen].bounds.size.height == 568.0f);
}

@end

然后,您可以从任何地方[[UIDevice currentDevice] isDeviceiPhone5]