2010-09-12 6 views
9

¿Existe un macro de preprocesador de compilación que pueda verificar, con #if o # ifdef para determinar si mi proyecto actual de Xcode está siendo desarrollado para iPhone o iPad?#if check (macro del preprocesador) para diferenciar entre iPhone y iPad

EDITAR

Como varias respuestas han señalado, a menudo aplicaciones son universales, y el mismo binario puede funcionar en ambos dispositivos. El comportamiento condicional entre estos dispositivos muy similares debería resolverse en tiempo de ejecución en lugar de compilar.

Respuesta

8

No hay manera de determinar si su aplicación se ha creado para iPhone o iPad. Las directivas del preprocesador #if se resuelven durante la compilación. Una vez que su aplicación está construida y marcada como Universal, debe ejecutarse correctamente en ambos dispositivos. Durante la construcción, nadie sabe dónde se instalará más adelante y se puede instalar una versión en ambos.

Sin embargo es posible que desee hacer una de estas:

  1. Detectar modelo de dispositivodurante el tiempo de ejecución.

    Para ello, utilice [[UIDevice currentDevice] model] y compare con iPhone, iPod touch o iPad cuerdas. Esto le devolverá el dispositivo correcto incluso cuando se ejecuta en el modo de compatibilidad en el iPad (para aplicaciones solo para iPhone). Esto puede ser útil para análisis de uso.

  2. Detectar interfaz de usuario modismoen tiempo de ejecución.

    Esto es lo que todo el mundo busca, al proporcionar contenido diferente para iPhone y iPad. Use [[UIDevice currentDevice] userInterfaceIdiom] y compárelo con UIUserInterfaceIdiomPhone o UIUserInterfaceIdiomPad.Es posible que desee hacer que los métodos de conveniencia como esto:

    @implementation UIDevice (UserInterfaceIdiom) 
    
    - (BOOL)iPhone { 
        return (self.userInterfaceIdiom == UIUserInterfaceIdiomPhone); 
    } 
    + (BOOL)iPhone { 
        return [[UIDevice currentDevice] iPhone]; 
    } 
    
    - (BOOL)iPad { 
        return (self.userInterfaceIdiom == UIUserInterfaceIdiomPad); 
    } 
    + (BOOL)iPad { 
        return [[UIDevice currentDevice] iPad]; 
    } 
    
    @end 
    

    continuación, puede utilizar:

    if ([[UIDevice currentDevice] iPhone]) { } 
    // or 
    if ([UIDevice iPhone]) { } 
    // or 
    if (UIDevice.iPhone) { } 
    
+0

Hace más de 2 años que pregunté esto, ahora entiendo cuándo se deben usar las comprobaciones de tiempo de compilación versus tiempo de ejecución. ¡Gracias por la respuesta! Estoy seguro de que ayudará a otros. –

+0

¡Oh, la fecha! Así que espero que ayude a alguien. – Tricertops

+2

¿Por qué demonios no es esta la respuesta aceptada? –

9
NSString *deviceType = [UIDevice currentDevice].model; 

if([deviceType isEqualToString:@"iPhone"]) { 
    //iPhone 
} 
else if([deviceType isEqualToString:@"iPod touch"]) { 
    //iPod Touch 
} 
else { 
    //iPad 
} 

Puede no, en lo que a mí respecta, utiliza #if o #ifdef hacer esto, pero, debido a que es compatible Obj-C es un superconjunto estricto de C.

relacionadas: Determine device (iPhone, iPod Touch) with iPhone SDK

+0

Eso es lo que tenía miedo, ya que es esencial ejecutar las mismas aplicaciones. –

+0

Obj-C es un superconjunto estricto de Obj-C ??? –

+0

Gracias por la ayuda sin embargo. Creo que puedo pensar en una configuración que puedo configurar que crea un #define basado en esto. –

25

Algunas ideas en la sección de comentarios de este blog

http://greensopinion.blogspot.com/2010/04/from-iphone-to-ipad-creating-universal.html

Parcialmente utilizando

UI_USER_INTERFACE_IDIOM() 

Tales como:

#ifdef UI_USER_INTERFACE_IDIOM() 
    #define IS_IPAD() (UI_USER_INTERFACE_IDIOM() == UIUserInterfaceIdiomPad) 
#else 
    #define IS_IPAD() (false) 
#endif 
+0

Eso es un poco raro, pero eso es genial. –

+2

esto es en realidad sugerido en la conferencia de manzana de wwdc. – Vojto

+0

¿Por qué molestarse con la macro? Nadie es compatible con iOS inferior a 3.2, por lo que la ventaja de 'UI_USER_INTERFACE_IDIOM' es none. – Tricertops

0

comprobar mi respuesta https://stackoverflow.com/a/18226313/1934750 No se puede hacer esto con uno binario. Necesitas un binario para iPhone y otro para iPad. Por supuesto, puede usar binarios universales para iPhone y iPad, pero deberá determinar la expresión idiomática de los dispositivos en tiempo de ejecución.

+0

Gracias, me di cuenta un poco después de hacer la pregunta (ver edición). –

0

Updation para SWIFT:

no podía usar preprocesador. Realiza la función global como

func IS_IPAD() -> Bool { 
(return (UIDevice.respondsToSelector(Selector("userInterfaceIdiom"))) && (UIDevice.currentDevice().userInterfaceIdiom == UIUserInterfaceIdiom.Pad))} 
+2

Como se documenta en la macro UI_USER_INTERFACE_IDIOM(), solo necesita buscar el selector si está implementando para una versión de iOS menor que 3.2. El uso de Swift impide eso. ;) –

0

utilizo el siguiente código para AppleTV 4 porque UIUserInterfaceIdiomUnspecified, no parece funcionar, ni puedo encontrar otras enumeraciones:

#ifdef TARGET_OS_IOS 
CGSize result = [[UIScreen mainScreen] bounds].size; 
    if(result.width == 1920) { 
     NSLog(@"tvOS"); 
    } 
#endif 

Solía ​​usar esto para iPad y tal antes de los tiempos oscuros, antes del imperio OB1, buenas noches. Pero puede utilizar esta técnica similar para otros tamaños de pantalla que conozca.

Cuestiones relacionadas