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

Есть ли определенный флаг компилятора 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

Ответы

Ответ 1

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

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

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

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

Итак, вы могли бы просто сказать, отрицательно:

BOOL deviceIsPad = (UI_USER_INTERFACE_IDIOM() != UIUserInterfaceIdiomPhone);

Ответ 2

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

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

Ответ 3

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

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

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

Ответ 4

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

С целью [myapp] -iPad, выбранной в качестве активной цели, выберите Project → Edit Active Target [myapp] -iPad. Найдите "c flags" и дважды щелкните. Добавьте флаг для "-D TARGET_IPAD". Теперь символ TARGET_IPAD будет определен только для вашей цели iPad.

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

(Отредактировано, я был смущен терминологией "универсальных" приложений и т.д.)

Ответ 5

Или → чтобы быть уверенным

-(BOOL)isDeviceAniPad
{   
#if __IPHONE_OS_VERSION_MIN_REQUIRED >= 30200
 BOOL deviceIsPad = ([[UIDevice currentDevice] userInterfaceIdiom] == UIUserInterfaceIdiomPad);
 return deviceIsPad;
#endif
 return NO;
}

Ответ 6

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

-(BOOL)isDeviceAniPad
{   
#if __IPHONE_OS_VERSION_MIN_REQUIRED >= 30200
  return ([[UIDevice currentDevice] userInterfaceIdiom] == UIUserInterfaceIdiomPad);
#endif
  return NO;
}