Лучший способ программно определить оборудование iPad / iPhone - PullRequest
46 голосов
/ 19 мая 2010

Причина, по которой мне нужно выяснить, заключается в том, что на iPad UIPickerView имеет ту же высоту в альбомной ориентации, что и в портретной. На айфоне все иначе. Руководство по программированию для iPad вводит значение «идиома» в 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

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

Ответы [ 9 ]

63 голосов
/ 02 июня 2010

Проверка во время выполнения (ваш первый способ) полностью отличается от #if во время компиляции. Директивы препроцессора не дадут вам универсальное приложение.

Предпочтительным способом является использование макроса Apple:

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.

26 голосов
/ 07 апреля 2015

Я отвечаю на это сейчас (и в более позднюю дату), потому что многие из существующих ответов довольно старые, и большинство проголосовавших «за» на самом деле, по-видимому, неверны в соответствии с текущей документацией Apple (iOS 8.1, 2015)!

Чтобы доказать мою точку зрения, это комментарий из заголовочного файла Apple (всегда смотрите на источник и заголовки 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)
17 голосов
/ 19 мая 2010

Мне нравится моя isPad () функция. Тот же код, но держите его вне поля зрения и только в одном месте.

15 голосов
/ 22 июля 2011

Мое решение (работает на 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
1 голос
/ 07 декабря 2017

В 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;
  }
0 голосов
/ 15 мая 2014
BOOL isIpad()
{
    if (UI_USER_INTERFACE_IDIOM() == UIUserInterfaceIdiomPad) {
        return YES;
    }
    return NO;
}
0 голосов
/ 22 сентября 2013

Если 1 - у вас уже есть приложение, установленное на вашем устройстве, 2 - вы изменяете настройки его сборки на «Универсальное» приложение, 3 - установить приложение на ваше устройство поверх уже существующего приложения (без удаления предыдущего)

Вы можете обнаружить, что представленные здесь решения для обнаружения iPhone / iPad не работают. Сначала удалите приложение, которое было «только» для iPad / iPhone, и установите его на свое устройство заново.

0 голосов
/ 05 ноября 2010

Если вы используете функции, которые не являются обратно совместимыми, я нашел лучший способ для меня - создать #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
0 голосов
/ 05 июля 2010

Поместите этот метод в ваш делегат приложения, чтобы вы могли вызывать его где угодно, используя [[[UIApplication sharedApplication] делегат] isPad]

-(BOOL)isPad
{
    BOOL isPad;
    NSRange range = [[[UIDevice currentDevice] model] rangeOfString:@"iPad"];
    if(range.location==NSNotFound)
    {
        isPad=NO;


    }
    else {
        isPad=YES;
    }

    return isPad;
}
...