API для определения того, работает ли на iPhone или iPad
Есть ли API для проверки во время выполнения, выполняетесь ли вы на iPhone или iPad?
Один из способов, который я могу придумать, - использовать
[[UIDevice currentDevice] model];
И обнаружите существование строки @ "iPad" - которая кажется немного хрупкой.
В 3.2 SDK я вижу, что UIDevice
также имеет свойство, которое действительно то, что я ищу, но не работает для pre-3.2 (очевидно):
[[UIDevice currentDevice] userInterfaceIdiom];
Существуют ли другие способы, кроме проверки наличия @ "iPad" для универсального приложения?
Ответы
Ответ 1
Оформить заказ UI_USER_INTERFACE_IDIOM
.
Возвращает идиому интерфейса, поддерживаемую текущим устройством.
Возвращаемое значение
UIUserInterfaceIdiomPhone
, если устройство является iPhone или iPod touch или UIUserInterfaceIdiomPad
, если устройство является iPad.
UIUserInterfaceIdiom
Тип интерфейса, который должен использоваться на текущем устройстве
typedef enum {
UIUserInterfaceIdiomPhone,
UIUserInterfaceIdiomPad,
} UIUserInterfaceIdiom;
Ответ 2
Только для моей справки:
@property (nonatomic, readonly) BOOL isPhone;
-(BOOL)isPhone {
return (UI_USER_INTERFACE_IDIOM()==UIUserInterfaceIdiomPhone);
}
или используйте #define
#define IS_PHONE (UI_USER_INTERFACE_IDIOM()==UIUserInterfaceIdiomPhone)
Однако, если вы используете isPhone
по всему вашему коду, это в целом плохая практика. Используйте шаблон factory и полиморфизм, чтобы содержать ваши инструкции if
, поэтому вы получаете объекты, созданные для телефона или iPad, а затем работаете с ними.
Добавлен
Я использую это решение по всему моему коду. Он добавляет стандартный шаблон factory в alloc.
#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
, когда вам это нужно.
Ответ 3
- Проверяйте наличие свойства userInterfaceIdiom, ответы на него отвечаютToSelector:. Если этого не существует, мы находимся на устройстве до 3.2, а не iPad.
- Если userInterfaceIdiom существует, используйте его.
Изменить:... что явно соответствует макросу UI_USER_INTERFACE_IDIOM(), поэтому используйте его.:)
Ответ 4
Вы можете проверить, запускаете ли приложение приложение на 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;
}
Ответ 5
Используйте NSClassFromString и класс, предназначенный для iPad. Подробнее здесь:
http://developer.apple.com/iphone/library/documentation/General/Conceptual/iPadProgrammingGuide/StartingYourProject/StartingYourProject.html#//apple_ref/doc/uid/TP40009370-CH9-SW3