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