2010-05-19 5 views
45

Причина, по которой мне нужно выяснить, это то, что на iPad UIPickerView имеет ту же высоту в альбомной ориентации, что и в портрете. На iPhone это другое. Руководство по программированию IPad вводит «идиома» значение UIDevice:Лучший способ программного обнаружения аппаратного обеспечения iPad/iPhone

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 

для меня это начинает выглядеть очень неуклюжим. Что лучше?

ответ

24

Я отвечаю на это сейчас (и в этой последней дате), потому что многие из существующих ответов довольно старые и самые Проголосовали на самом деле, кажется, неправильно с точки зрения Яблоки текущего DOCS (IOS 8,1, 2015)!

Чтобы доказать свою точку зрения, это комментарий от заголовка файла яблок (всегда смотрите на источник 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) в версиях прошивки ПРИОР до 3.2, используйте Apple, при условии, макроса:

// for iPhone use UIUserInterfaceIdiomPhone 
if(UI_USER_INTERFACE_IDIOM() == UIUserInterfaceIdiomPad) 

2) По версии прошивки 3.2 или более поздняя версия, следует использовать свойство на [UIDevice CurrentDevice]:

// for iPhone use UIUserInterfaceIdiomPhone 
if([UIDevice currentDevice].userInterfaceIdiom == UIUserInterfaceIdiomPad) 
+0

Если вы перейдете к определению UI_USER_INTERFACE_IDIOM(), вы увидите, что он использует свойство [[UIDevice currentDevice] userInterfaceIdiom]. 'статическими рядный UIUserInterfaceIdiom UI_USER_INTERFACE_IDIOM() { возвращение ([[UIDevice CurrentDevice] respondsToSelector: @selector (userInterfaceIdiom)] [[UIDevice CurrentDevice] userInterfaceIdiom]: UIUserInterfaceIdiomPhone?);' – KarenAnne

+0

Ях! Вот как я нашел комментарий в своих документах, которые я цитировал в этом ответе :) –

+0

Что я имею в виду, вы можете использовать 'UI_USER_INTERFACE_IDIOM()' даже в iOS версии 3.2 или новее, потому что это то же самое, что '[UIDevice currentDevice] .userInterfaceIdiom ] '. Правильно? – KarenAnne

17

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

61

Проверка во время выполнения (ваш первый способ) полностью отличается от #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 ,

0

Поместите этот метод в App делегатом, так что вы можете вызвать его в любом месте, используя [[[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; 
} 
+0

1st: Метод 'UI_USER_INTERFACE_IDIOM()' является способом перехода. 2nd: ваша модель устройств не изменится, поэтому сохраните себе несколько циклов процессора и кешируйте результат статической переменной и используйте 'dispatch_once'. – stigi

+0

Включение новой функции в ваше приложение делает всех вызывающих лиц зависимыми от любого класса, в который вы помещаете это. Просто вызов одной из функций API кажется лучше. – Pat

0

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

Ваше решение приведет к необходимости иметь две версии вашего двоичного кода. – ruralcoder

14

Мое решение (работает на 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 
+0

это хороший один, и мы можем #define IS_IPHONE (UI_USER_INTERFACE_IDIOM() == UIUserInterfaceIdiomPhone) #define IS_IPAD (UI_USER_INTERFACE_IDIOM() == UIUserInterfaceIdiomPad) это также мы можем сделать правильный ... Еще раз спасибо lewisanderson – Bala

+1

Это не лучшая логика, потому что iPod в большинстве случаев должен быть сгруппирован с iPhone, а не iPad. – Nate

0

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

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

0
BOOL isIpad() 
{ 
    if (UI_USER_INTERFACE_IDIOM() == UIUserInterfaceIdiomPad) { 
     return YES; 
    } 
    return NO; 
} 
1

В Swift использование userInterfaceIdiom экземпляра собственности как-

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; 
    }