Как работает ui_user_interface_idiom () для работы с iPhone OS SDK <3.2

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

  •  24-09-2019
  •  | 
  •  

Вопрос

Apple консультирует, используя следующий код для обнаружения того, работает ли на iPad или iPhone / iPod Touch:

if (UI_USER_INTERFACE_IDIOM() == UIUserInterfaceIdiomPad) {
  // The device is an iPad running iPhone 3.2 or later.
  // [for example, load appropriate iPad nib file]
}
else {
  // The device is an iPhone or iPod touch.
  // [for example, load appropriate iPhone nib file]
}

Проблема в том, что ui_user_interface_idiom () и UiuserInterFaceIdiompad не определены в SDKS до 3,2. Это, кажется, полностью побеждает цель такого функции. Они могут быть компинтированы только и запущены только на iPhone OS 3.2 (iPhone OS 3.2 может работать только на iPad). Поэтому, если вы можете использовать ui_user_interface_idiom (), результат всегда будет указывать на iPad.

Если вы включите этот код и целевую ОС 3.1.3 (самая последняя сенсорная os iPhone / iPod / iPod), чтобы проверить ваш универсальный код приложения для iPhone, вы получите ошибки компилятора, поскольку символы не определены в 3.1.3 или более раннее При компиляции для iPhone Simulator 3.1.3.

Если это рекомендуемый подход Apple к обнаружению устройства времени выполнения, что я делаю не так? У кого-нибудь удалось использовать этот подход к обнаружению устройства?

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

Решение

Я делаю это, чтобы получить код для компиляции как в 3.1.3, так и 3.2:

BOOL iPad = NO;
#ifdef UI_USER_INTERFACE_IDIOM
iPad = (UI_USER_INTERFACE_IDIOM() == UIUserInterfaceIdiomPad);
#endif
if (iPad) {
// iPad specific code here
} else {
// iPhone/iPod specific code here
}

Я также написал быстрое блог об этом здесь:http://www.progrables.com/2010/04/03/compiling-conditional-code-in-Universal-iphone-ipad-applations/

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

Это то, что я использую:

- (BOOL) amIAnIPad {
    #if (__IPHONE_OS_VERSION_MAX_ALLOWED >= 30200)
        if ([[UIDevice currentDevice] respondsToSelector: @selector(userInterfaceIdiom)])
            return ([UIDevice currentDevice].userInterfaceIdiom == UIUserInterfaceIdiomPad);
    #endif
    return NO;
}

Это условно компилируется, так что вы все еще можете построить для SIM 3.0. Затем он проверяет, отвечает ли класс Uidevice на селектор. Если любой из них не удается, это не iPad.

Если это рекомендуемый подход к Apple к время выполненияОбнаружение устройства, что я делаю не так? У кого-нибудь удалось использовать этот подход к обнаружению устройства?

Это решение для время выполнения Обнаружение:

#define isIPhone (![[UIDevice currentDevice] respondsToSelector:@selector(userInterfaceIdiom)] || [[UIDevice currentDevice] userInterfaceIdiom] == UIUserInterfaceIdiomPhone)

После этого вы можете легко проверить его где угодно в вашем коде:

if (isIPhone) { ... }

Разница между этим и использованием #if / #ifdef заключается в том, что это тестирование времени выполнения, а #if - тестирование времени компиляции.

Я думаю, что тестирование времени выполнения лучше, потому что вы можете использовать точную для любой версии ОС в этом случае. Если вы используете проверку времени компиляции, вам нужно будет производить разные исполняемые файлы для разных версий ОС.

Если ваша проблема - это ошибки времени компиляции, вы просто должны составить против последней версии SDK (см. Также Как получить доступ к слабой связанной основам в iOS?).

Я считаю, что ответ просто не пытайтесь запустить код на iPhone симулятор 3.1.3 или раньше. Всегда компилируйте с 3,2 SDK. IPhone Simulator 3.2 получит вам симулятор iPad или компилируйте для устройства iPhone 3.2 и поместить приложение на телефон, чтобы проверить его.

Нет никакого способа скомпилировать против 3,2 SDK и использовать 3,1,3 или более раннее симулятор.

Вместо любого материала на основе компилятора я использую:

- (BOOL)deviceIsAnIPad {
if ([[UIDevice currentDevice] respondsToSelector:@selector(userInterfaceIdiom)])
    //We can test if it's an iPad. Running iOS3.2+
    if ([[UIDevice currentDevice] userInterfaceIdiom] == UIUserInterfaceIdiomPad)
        return YES; //is an iPad
    else 
        return NO; //is an iPhone
else 
    return NO; //does not respond to selector, therefore must be < iOS3.2, therefore is an iPhone
}

Объявить, используя это

#ifdef UI_USER_INTERFACE_IDIOM
#define IS_IPAD (UI_USER_INTERFACE_IDIOM() == UIUserInterfaceIdiomPad)
#else
#define IS_IPAD false
#endif

Затем используйте проверку, как показано ниже

#define DetailLabel_PosX (IS_IPAD ? 200 : 160)

Есть также некоторые определенные для проверки iPhone 5

#define IS_IPHONE5 (([[UIScreen mainScreen] bounds].size.height-568)?NO:YES)
#define IOS_OLDER_THAN_6 ([[[UIDevice currentDevice] systemVersion] floatValue] < 6.0 )
#define IOS_NEWER_OR_EQUAL_TO_6 ([[[UIDevice currentDevice] systemVersion] floatValue] >= 6.0 )

Это, кажется, полностью побеждает цель такого функции. Они могут быть компинтированы только и запущены только на iPhone OS 3.2 (iPhone OS 3.2 может работать только на iPad). Поэтому, если вы можете использовать ui_user_interface_idiom (), результат всегда будет указывать на iPad.

Это совершенно неверно. Это может быть скомпилирован на базе SDK 3,2, но это может быть бегать В любой ОС, если вы установите цель развертывания соответствующим образом.

Ui_user_interface_idiom () и UiuserInterFaceiDiomompad могут использоваться на iOS3.2 и выше, важная часть - «вверх». Конечно. iOS3.2 - только для iPad, но iOS4.0 и запускается как на iPhone, так и iPad, поэтому чек не такой бессмысленный, как вы думаете.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top