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

StackOverflow https://stackoverflow.com/questions/2159951

  •  23-09-2019
  •  | 
  •  

Вопрос

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

Это было полезно?

Решение

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

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);

Другие советы

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

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

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

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

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

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

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

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

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

Или -> просто для уверенности

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

Я думаю, что этого хватит

-(BOOL)isDeviceAniPad
{   
#if __IPHONE_OS_VERSION_MIN_REQUIRED >= 30200
  return ([[UIDevice currentDevice] userInterfaceIdiom] == UIUserInterfaceIdiomPad);
#endif
  return NO;
}
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top