Есть ли определенный флаг компилятора 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
6 ответов
Правильный API-интерфейс для проверки iPad и iPhone/iPad Touch во время выполнения:
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);
Вместо использования флагов времени компиляции, вы должны использовать проверку во время выполнения, например, использовать NSClassFromString
чтобы увидеть, существует ли класс, потому что одно и то же приложение может быть установлено на обоих устройствах.
И из-за возможности запуска приложения на обоих устройствах, нет встроенной проверки во время компиляции, ориентирована ли она на iPad или нет.
Для нескольких целей, совместно использующих один и тот же проект / код, я делаю это, редактируя флаги C для моей цели iPad.
Выбрав цель [myapp]-iPad в качестве активной цели, выберите "Проект" -> "Изменить активную цель" [myapp]-iPad. Найдите "c flags" и дважды щелкните. Добавьте флаг для "-D TARGET_IPAD". Теперь символ TARGET_IPAD будет определен только для вашей цели iPad.
Конечно, это работает, только если вы используете отдельные цели для iPad и iPhone. Если вы используете один и тот же двоичный файл на обоих, очевидно, что компилятор ничего не сможет сделать для вас. (Однако 3.2 SDK на конец января даже не поддерживает приложения Universal.)
(Отредактировано; я не понял терминологию универсальных приложений и т. Д.)
Или -> просто чтобы быть уверенным
-(BOOL)isDeviceAniPad
{
#if __IPHONE_OS_VERSION_MIN_REQUIRED >= 30200
BOOL deviceIsPad = ([[UIDevice currentDevice] userInterfaceIdiom] == UIUserInterfaceIdiomPad);
return deviceIsPad;
#endif
return NO;
}
В настоящее время я не нашел ничего, что позволило бы вам проверить, есть ли у вас iPad, но я также не уверен, рекомендует ли Apple проверку во время выполнения. Вот выдержка из Apple:
В дополнение к вашим контроллерам представления любые классы, которые совместно используются устройствами iPhone и iPad, должны включать макросы условной компиляции, чтобы изолировать код конкретного устройства. Хотя вы также можете использовать проверки во время выполнения, чтобы определить, доступны ли определенные классы или методы, это увеличит размер вашего исполняемого файла только путем добавления путей кода, которые не будут использоваться ни на одном устройстве, ни на другом. Разрешение компилятору удалить этот код помогает сохранить ваш код в чистоте.
Однако нет места, где бы я мог найти более конкретную информацию о макросах условной компиляции.
Я думаю, что это будет делать
-(BOOL)isDeviceAniPad
{
#if __IPHONE_OS_VERSION_MIN_REQUIRED >= 30200
return ([[UIDevice currentDevice] userInterfaceIdiom] == UIUserInterfaceIdiomPad);
#endif
return NO;
}