Есть ли определенный флаг компилятора Xcode, который устанавливается при компиляции для iPad? - PullRequest
13 голосов
/ 29 января 2010

Есть ли определенный флаг компилятора Xcode, который устанавливается при компиляции для iPad?

Я хочу условно скомпилировать iPad с кодом iPhone / iPod Touch, например:

#ifdef TARGET_IPAD
   code for iPad
#else
   code for iPhone
#endif

Я знаю, что в TargetConditionals.h уже есть TARGET_OS_IPHONE и TARGET_CPU_ARM, но есть что-нибудь, что легко и конкретно предназначается для iPad?

-Rei

Ответы [ 6 ]

16 голосов
/ 22 марта 2010

Правильный API-интерфейс для проверки iPad / iPhone / iPad во время выполнения:

BOOL deviceIsPad = ([[UIDevice currentDevice] userInterfaceIdiom] == UIUserInterfaceIdiomPad);

Файл заголовка UIDevice также включает удобный макрос UI_USER_INTERFACE_IDIOM (), который будет полезен, если целью развертывания является

#define UI_USER_INTERFACE_IDIOM() ([[UIDevice currentDevice] respondsToSelector:@selector(userInterfaceIdiom)] ? [[UIDevice currentDevice] userInterfaceIdiom] : UIUserInterfaceIdiomPhone)

Так что вы можете просто сказать, отрицательно:

BOOL deviceIsPad = (UI_USER_INTERFACE_IDIOM() != UIUserInterfaceIdiomPhone);
2 голосов
/ 29 января 2010

Вместо использования флагов времени компиляции вы должны использовать проверку во время выполнения, например используйте NSClassFromString, чтобы увидеть, существует ли класс, потому что одно и то же приложение может быть установлено на обоих устройствах.

И из-за возможности запуска приложения на обоих устройствах нет встроенной проверки во время компиляции, предназначено ли оно для iPad или нет.

0 голосов
/ 09 июня 2010

Или -> просто чтобы быть уверенным

-(BOOL)isDeviceAniPad
{   
#if __IPHONE_OS_VERSION_MIN_REQUIRED >= 30200
 BOOL deviceIsPad = ([[UIDevice currentDevice] userInterfaceIdiom] == UIUserInterfaceIdiomPad);
 return deviceIsPad;
#endif
 return NO;
}
0 голосов
/ 21 апреля 2010

Я думаю, что это будет делать

-(BOOL)isDeviceAniPad
{   
#if __IPHONE_OS_VERSION_MIN_REQUIRED >= 30200
  return ([[UIDevice currentDevice] userInterfaceIdiom] == UIUserInterfaceIdiomPad);
#endif
  return NO;
}
0 голосов
/ 01 февраля 2010

Для нескольких целей, совместно использующих один и тот же проект / код, я делаю это, редактируя флаги C для моей цели iPad.

Выбрав цель [myapp] -iPad в качестве активной цели, выберите «Проект» -> «Изменить активную цель» [myapp] -iPad. Найдите «c flags» и дважды щелкните. Добавьте флаг для "-D TARGET_IPAD". Теперь символ TARGET_IPAD будет определен только для цели iPad.

Конечно, это работает, только если вы используете отдельные цели для iPad и iPhone. Если вы используете один и тот же двоичный файл на обоих, очевидно, что компилятор ничего не сможет сделать для вас. (Однако 3.2 SDK на конец января даже не поддерживает приложения Universal.)

(Отредактировано; я не понял терминологию универсальных приложений и т. Д.)

0 голосов
/ 29 января 2010

В настоящее время я не нашел ничего, что позволило бы вам проверить, если вы находитесь на iPad, но я также не уверен, рекомендует ли Apple проверку во время выполнения. Вот выдержка из Apple:

В дополнение к вашим контроллерам представления любые классы, которые совместно используются устройствами iPhone и iPad, должны включать макросы условной компиляции, чтобы изолировать код конкретного устройства. Хотя вы также можете использовать проверки во время выполнения, чтобы определить, доступны ли определенные классы или методы, это увеличит размер вашего исполняемого файла только путем добавления путей кода, которые не будут использоваться на одном или другом устройстве. Разрешение компилятору удалить этот код помогает сохранить ваш код в чистоте.

Однако нет места, где бы я мог найти более конкретную информацию о макросах условной компиляции.

...