2010-05-19 18 views
45

La razón por la que necesito averiguar es que en un iPad, un UIPickerView tiene la misma altura en orientación horizontal como en vertical. En un iPhone es diferente. La guía de programación del iPad introduce un valor de "lenguaje" a UIDevice:mejor manera de detectar mediante programación iPad/iPhone hardware

UIDevice* thisDevice = [UIDevice currentDevice]; 
    if(thisDevice.userInterfaceIdiom == UIUserInterfaceIdiomPad) 
    { 
     // iPad 
    } 
    else 
    { 
     // iPhone 
    } 

que funciona bien mientras estás en el iPad (3.2), pero no iPhone (3.1.3) - lo que parece que también es necesario que haya un ifdef para compilar condicionalmente el registro de entrada, como:

#if __IPHONE_OS_VERSION_MIN_REQUIRED >= 30200 
     UIDevice* thisDevice = [UIDevice currentDevice]; 
     if(thisDevice.userInterfaceIdiom == UIUserInterfaceIdiomPad) 
     { 
      // etc. 
     } 
#endif 

para mí que está empezando a parecer muy torpe. ¿Cuál es una mejor manera?

Respuesta

24

estoy respondiendo a esto ahora (y en esta fecha tardía) porque muchas de las respuestas existentes son bastante antiguos, y la más votado en realidad parece estar mal de acuerdo con las manzanas docs actuales (IOS 8.1, 2015)!

Para probar mi punto, este es el comentario de archivo de cabecera Manzanas (Fíjese siempre en la fuente de Apple y cabeceras):

/*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.*/ 

Por lo tanto, el momento MANZANA recomienda manera de detectar iPhone iPad vs. , es el siguiente:

1) En las versiones de iOS PRIOR a 3,2, utilice la Manzana proporcionado macro:

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

2) En las versiones de IOS 3.2 o posterior, utilice la propiedad en [UIDevice currentDevice]:

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

Si se salta a la definición de UI_USER_INTERFACE_IDIOM(), verá que usa la propiedad [[UIDevice currentDevice] userInterfaceIdiom]. 'estático en línea UIUserInterfaceIdiom UI_USER_INTERFACE_IDIOM() { retorno ([[UIDevice currentDevice] respondsToSelector: @selector (userInterfaceIdiom)] [[UIDevice currentDevice] userInterfaceIdiom]: UIUserInterfaceIdiomPhone?);' – KarenAnne

+0

Yah! Así es como encontré el comentario en sus documentos que cité en esta respuesta :) –

+0

Lo que quiero decir es que puedes usar 'UI_USER_INTERFACE_IDIOM()' incluso en iOS 3.2 o posterior porque es lo mismo que '[UIDevice currentDevice] .userInterfaceIdiom ] '. ¿Derecha? – KarenAnne

17

me gusta mi función isPad(). Mismo código pero manténgalo fuera de la vista y en un solo lugar.

61

Comprobación en tiempo de ejecución (la primera forma) es completamente diferente de #if en tiempo de compilación. Las directivas de preprocesador no le darán una aplicación universal.

La mejor forma es utilizar Macro de 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. 
} 

Uso 3.2 como el SDK de base (porque la macro no está definido pre 3.2), puede orientar versiones del sistema operativo antes de hacerlo funcionar en el iPhone .

0

poner este método en su aplicación Delegado de modo que se le puede llamar en cualquier lugar usando [[[UIApplication sharedApplication] delegada] ISPAD]

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


    } 
    else { 
     isPad=YES; 
    } 

    return isPad; 
} 
+0

Primero: El método 'UI_USER_INTERFACE_IDIOM()' es el camino a seguir. 2º: el modelo de su dispositivo no cambiará, así que guárdese algunos ciclos de CPU y guarde en caché el resultado en una variable estática y use 'dispatch_once'. – stigi

+0

Poner una nueva función en algún lugar de la aplicación hace que todas las personas que llaman dependan de la clase en la que las insertas. Llamar simplemente a una de las funciones de la API parece mejor. – Pat

0

Si está utilizando características que no son compatibles hacia atrás, me encontré con la La mejor manera para mí es crear un #define en el encabezado precompilado. Ejemplo:

#if __IPHONE_OS_VERSION_MAX_ALLOWED > __IPHONE_3_2 
#define USING_4_X 
#endif 

Luego, en su código, usted puede hacer esto:

BOOL exists = NO; 
#ifdef USING_4_X   
exists = [SomeObject someMethod:[url lastPathComponent]]; 
#else 
exists = [SomeObject someMethod:[[url path] lastPathComponent]]; 
#endif 
+3

Su solución dará como resultado que necesita tener dos versiones de su binario. – ruralcoder

14

Mi solución (funciona en 3.2+):

#define IS_IPHONE (!IS_IPAD) 
#define IS_IPAD (UI_USER_INTERFACE_IDIOM() != UIUserInterfaceIdiomPhone) 

entonces,

if (IS_IPAD) 
    // do something 

o

if (IS_IPHONE) 
    // do something else 
+0

esto es bonita y podemos #define IS_IPHONE (UI_USER_INTERFACE_IDIOM() == UIUserInterfaceIdiomPhone) #define IS_IPAD (UI_USER_INTERFACE_IDIOM() == UIUserInterfaceIdiomPad) esto también es que podemos hacer ... gracias de nuevo lewisanderson – Bala

+1

Este no es el mejor lógica para usar, porque un iPod realmente debería estar agrupado con un iPhone en la mayoría de las situaciones, no en un iPad. – Nate

0

Si 1- ya ha instalado la aplicación en su dispositivo, 2- que cambiar su configuración de generación para ser una aplicación de 'Universal', 3- instalar la aplicación en el dispositivo en la parte superior de la pre -existing aplicación (sin borrar la anterior)

Usted puede encontrar que las soluciones proporcionadas aquí para detectar iPhone/iPad no funcionan. Primero, elimine la aplicación que era 'solo' para iPad/iPhone e instálela en su dispositivo.

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

En uso Swift propiedad userInterfaceIdiom ejemplo as-

if UIDevice.current.userInterfaceIdiom == .phone { 
    print("iPhone") 
} 

& Para otros dispositivos -

switch UIDevice.current.userInterfaceIdiom { 
    case .pad: 
     print("iPad") 
    case .phone: 
     print("iPhone") 
    case .tv: 
     print("TV") 
    case .carPlay: 
     print("carPlay") 
    default: break; 
    } 
Cuestiones relacionadas