Подтвердить что ты не робот

Лучший способ программно определить оборудование 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

Мне это кажется очень неуклюжим. Какой лучший способ?

4b9b3361

Ответ 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;
}