Лучший способ программно определить оборудование iPad/iPhone
Причина, по которой мне нужно выяснить, - это то, что на iPad у UIPickerView одинаковая высота в альбомной ориентации, как и в портрете. На iPhone это другое. Руководство по программированию iPad вводит значение "idiom" для UIDevice:
UIDevice* thisDevice = [UIDevice currentDevice];
if(thisDevice.userInterfaceIdiom == UIUserInterfaceIdiomPad)
{
// iPad
}
else
{
// iPhone
}
который работает нормально, когда вы находитесь в iPad (3.2), но не iPhone (3.1.3) - так что, похоже, там также должен быть ifdef, чтобы условно скомпилировать эту проверку, например:
#if __IPHONE_OS_VERSION_MIN_REQUIRED >= 30200
UIDevice* thisDevice = [UIDevice currentDevice];
if(thisDevice.userInterfaceIdiom == UIUserInterfaceIdiomPad)
{
// etc.
}
#endif
Мне это кажется очень неуклюжим. Какой лучший способ?
Ответы
Ответ 1
Я отвечаю на это сейчас (и в этот поздний срок), потому что многие из существующих ответов довольно старые, и большинство Up Voted на самом деле кажется неправильным в соответствии с текущими документами Apple (iOS 8.1, 2015)!
Чтобы доказать свою точку зрения, это комментарий из заголовочного файла Apples (всегда смотрите на источник и заголовки Apple):
/*The UI_USER_INTERFACE_IDIOM() macro is provided for use when
deploying to a version of the iOS less than 3.2. If the earliest
version of iPhone/iOS that you will be deploying for is 3.2 or
greater, you may use -[UIDevice userInterfaceIdiom] directly.*/
Следовательно, в настоящее время APPLE рекомендуется способ обнаружения iPhone против iPad, выглядит следующим образом:
1) В версиях iOS PRIOR до 3.2 используйте макрос, предоставленный Apple:
// for iPhone use UIUserInterfaceIdiomPhone
if(UI_USER_INTERFACE_IDIOM() == UIUserInterfaceIdiomPad)
2) В версиях iOS 3.2 или новее используйте свойство в [UIDevice currentDevice]:
// for iPhone use UIUserInterfaceIdiomPhone
if([UIDevice currentDevice].userInterfaceIdiom == UIUserInterfaceIdiomPad)
Ответ 2
Проверка во время выполнения (ваш первый способ) полностью отличается от #if во время компиляции. Директивы препроцессора не дают вам универсального приложения.
Предпочтительным способом является использование Apple Macro:
if (UI_USER_INTERFACE_IDIOM() == UIUserInterfaceIdiomPad)
{
// The device is an iPad running iPhone 3.2 or later.
}
else
{
// The device is an iPhone or iPod touch.
}
Используйте 3.2 в качестве базового SDK (потому что макрос не определен до 3.2), вы можете настроить целевые версии ОС, чтобы запустить его на iPhone.
Ответ 3
Мне нравится моя функция isPad(). Тот же код, но держите его вне поля зрения и только в одном месте.
Ответ 4
Мое решение (работает с 3.2 +):
#define IS_IPHONE (!IS_IPAD)
#define IS_IPAD (UI_USER_INTERFACE_IDIOM() != UIUserInterfaceIdiomPhone)
то
if (IS_IPAD)
// do something
или
if (IS_IPHONE)
// do something else
Ответ 5
В Swift используйте userInterfaceIdiom свойство экземпляра as-
if UIDevice.current.userInterfaceIdiom == .phone {
print("iPhone")
}
& Для других устройств -
switch UIDevice.current.userInterfaceIdiom {
case .pad:
print("iPad")
case .phone:
print("iPhone")
case .tv:
print("TV")
case .carPlay:
print("carPlay")
default: break;
}
Ответ 6
Поместите этот метод в свой делегат приложения, чтобы вы могли его вызывать в любом месте, используя [[[UIApplication sharedApplication] delegate] isPad]
-(BOOL)isPad
{
BOOL isPad;
NSRange range = [[[UIDevice currentDevice] model] rangeOfString:@"iPad"];
if(range.location==NSNotFound)
{
isPad=NO;
}
else {
isPad=YES;
}
return isPad;
}
Ответ 7
Если вы используете функции, которые не поддерживают обратную совместимость, я нашел для меня лучший способ создать #define в предварительно скомпилированном заголовке. Пример:
#if __IPHONE_OS_VERSION_MAX_ALLOWED > __IPHONE_3_2
#define USING_4_X
#endif
Затем в вашем коде вы можете сделать это:
BOOL exists = NO;
#ifdef USING_4_X
exists = [SomeObject someMethod:[url lastPathComponent]];
#else
exists = [SomeObject someMethod:[[url path] lastPathComponent]];
#endif
Ответ 8
Если
1- у вас уже установлено приложение на ваше устройство,
2- вы меняете настройки своей сборки как универсального приложения,
3- установите приложение на свое устройство поверх уже существующего приложения (без удаления предыдущего)
Вы можете обнаружить, что предлагаемые здесь решения для обнаружения iPhone/iPad не работают. Во-первых, удалите приложение "только" для iPad/iPhone и установите его на свое устройство.
Ответ 9
BOOL isIpad()
{
if (UI_USER_INTERFACE_IDIOM() == UIUserInterfaceIdiomPad) {
return YES;
}
return NO;
}