32

是否有用于在运行时检查您是在 iPhone 还是 iPad 上运行的 API?

我能想到的一种方法是使用:

[[UIDevice currentDevice] model];

并检测字符串 @"iPad" 的存在——这似乎有点脆弱。

在 3.2 SDK 中,我看到它UIDevice还有一个属性,这正是我正在寻找的,但不适用于 3.2 之前的版本(显然):

[[UIDevice currentDevice] userInterfaceIdiom]; 

除了检查通用应用程序的@“iPad”是否存在之外,还有其他方法吗?

4

5 回答 5

41

结帐UI_USER_INTERFACE_IDIOM

返回当前设备支持的接口习惯用法。


UIUserInterfaceIdiomPhone如果设备是 iPhone 或 iPod touch 或者UIUserInterfaceIdiomPad设备是 iPad,则返回值。

UIUserInterfaceIdiom

当前设备上应该使用的接口类型

typedef enum {
   UIUserInterfaceIdiomPhone,
   UIUserInterfaceIdiomPad,
} UIUserInterfaceIdiom;
于 2010-05-21T18:08:58.010 回答
15

仅供我参考:

@property (nonatomic, readonly) BOOL isPhone;

-(BOOL)isPhone {
    return (UI_USER_INTERFACE_IDIOM()==UIUserInterfaceIdiomPhone);
}

或使用#define

#define IS_PHONE  (UI_USER_INTERFACE_IDIOM()==UIUserInterfaceIdiomPhone)

但是,如果您使用isPhone所有代码,这通常是不好的做法。使用工厂模式和多态性来保持您的if语句包含在内,因此您可以获得为手机或 iPad 创建的对象,然后使用这些对象。

添加

我现在在我的代码中使用这个解决方案。它将标准工厂模式添加到分配中。

#define ALLOC_PER_DEVICE()  id retVal = nil; \
                        NSString *className = NSStringFromClass(self);\
                        if (IS_PHONE && ![className hasSuffix:@"Phone"]) {\
                            className = [NSString stringWithFormat:@"%@Phone", className];\
                            Class newClass = NSClassFromString(className);\
                            retVal = [newClass alloc];\
                        }\
                        if (!retVal)\
                            retVal = [super alloc];\
                        assert(retVal != nil);\
                        return retVal\

然后我的分配看起来像这样:

+alloc { ALLOC_PER_DEVICE(); }

我添加了一个名为TheClassPhone电话版本的子类。

注意:由于在 Objective-C 中没有多重继承,使用继承来解决你的问题有点被高估了(即,如果你有子类的子类,它就不起作用)。if当你需要它时,没有什么比得上好。

于 2012-07-23T16:21:57.973 回答
1

您可以使用以下代码检查您是否在 iPhone 或 iPad 上运行该应用程序:

- (NSString *)deviceModel
{
    struct utsname systemInfo;
    uname(&systemInfo);
    return [NSString stringWithCString:systemInfo.machine encoding:NSUTF8StringEncoding];
}

- (NSString *) platformString
{
    NSString *platform = [self deviceModel];
    if ([platform isEqualToString:@"iPhone1,1"])    return @"iPhone_2G";
    else if ([platform isEqualToString:@"iPhone1,2"])    return @"iPhone_3G";
    else if ([platform isEqualToString:@"iPhone2,1"])    return @"iPhone_3GS";
    else if ([platform isEqualToString:@"iPhone3,1"])    return @"iPhone_4";
    else if ([platform isEqualToString:@"iPhone3,3"])    return @"Verizon_iPhone_4";
    else if ([platform isEqualToString:@"iPhone4,1"])    return @"iPhone_4S";
    else if ([platform isEqualToString:@"iPhone5,1"])    return @"iPhone_5";
    else if ([platform isEqualToString:@"iPhone5,2"])    return @"iPhone_5";
    else if ([platform isEqualToString:@"iPod1,1"])      return @"iPod_Touch 1G";
    else if ([platform isEqualToString:@"iPod2,1"])      return @"iPod_Touch 2G";
    else if ([platform isEqualToString:@"iPod3,1"])      return @"iPod_Touch 3G";
    else if ([platform isEqualToString:@"iPod4,1"])      return @"iPod_Touch 4G";
    else if ([platform isEqualToString:@"iPad1,1"])           return @"iPad_1G";
    else if ([platform isEqualToString:@"iPad2,1"])      return @"iPad_2(WiFi)";
    else if ([platform isEqualToString:@"iPad2,2"])      return @"iPad_2(GSM)";
    else if ([platform isEqualToString:@"iPad2,3"])      return @"iPad_2(CDMA)";
    else if ([platform isEqualToString:@"iPad3,1"])      return @"iPad_3";
    else if ([platform isEqualToString:@"iPad3,2"])      return @"iPad_3(GSM/CDMA)";
    else if ([platform isEqualToString:@"iPad3,3"])      return @"iPad_3(GSM)";
    else if ([platform isEqualToString:@"iPad3,4"])      return @"iPad_3(GSM)";
    else if ([platform isEqualToString:@"iPad2,5"])      return @"iPad_mini_1G";
    else if ([platform isEqualToString:@"i386"])         return @"Simulator";
    else if ([platform isEqualToString:@"x86_64"])       return @"Simulator";
    return platform;
}
于 2012-11-09T13:19:20.147 回答
1
  1. 使用 respondsToSelector: 检查 userInterfaceIdiom 属性是否存在。如果它不存在,我们使用的是 3.2 之前的设备,因此不是 iPad。
  2. 如果 userInterfaceIdiom 存在,请使用它。

编辑: ...这显然正是 UI_USER_INTERFACE_IDIOM() 宏所做的,所以请改用它。:)

于 2010-05-21T18:18:48.170 回答
1

使用 NSClassFromString 和特定于 iPad 的类。在这里阅读更多:

http://developer.apple.com/iphone/library/documentation/General/Conceptual/iPadProgrammingGuide/StartingYourProject/StartingYourProject.html#//apple_ref/doc/uid/TP40009370-CH9-SW3

于 2010-05-21T18:14:17.633 回答