¿Hay un compilador Xcode indicador específico que consigue el sistema al compilar para el iPad?

StackOverflow https://stackoverflow.com/questions/2159951

  •  23-09-2019
  •  | 
  •  

Pregunta

¿Hay una bandera específica compilador Xcode que consigue el sistema al compilar para el iPad?

Quiero compilar condicionalmente iPad vs código iPod Touch iPhone / por ejemplo:

#ifdef TARGET_IPAD
   code for iPad
#else
   code for iPhone
#endif

Sé que ya hay TARGET_OS_IPHONE y TARGET_CPU_ARM en TargetConditionals.h pero nada tan fácilmente y, específicamente, objetivos IPAD?

-rei

¿Fue útil?

Solución

La API correcta para su uso para la comprobación en tiempo de ejecución del iPad vs táctil iPhone / iPad es:

BOOL deviceIsPad = ([[UIDevice currentDevice] userInterfaceIdiom] == UIUserInterfaceIdiomPad);

El archivador cabecera UIDevice también incluye una macro conveniente, UI_USER_INTERFACE_IDIOM (), que será útil si su objetivo es el despliegue

#define UI_USER_INTERFACE_IDIOM() ([[UIDevice currentDevice] respondsToSelector:@selector(userInterfaceIdiom)] ? [[UIDevice currentDevice] userInterfaceIdiom] : UIUserInterfaceIdiomPhone)

Por lo que sólo podría decir, negativa:

BOOL deviceIsPad = (UI_USER_INTERFACE_IDIOM() != UIUserInterfaceIdiomPhone);

Otros consejos

En lugar de utilizar banderas en tiempo de compilación, se debe utilizar el registro de entrada, por ejemplo, el tiempo de ejecución NSClassFromString uso para ver si existe una clase debido a que la misma aplicación puede ser instalada en ambos dispositivos.

Y debido a la posibilidad de ejecutar la aplicación en ambos dispositivos, no hay un sistema incorporado en el registro de entrada tiempo de compilación si se dirige a IPAD o no.

En la actualidad no se encontró nada que le permiten verificar si se encuentra en un iPad, pero también estoy seguro de si Apple recomienda controles en tiempo de ejecución. He aquí un extracto de Apple:

  

Además de sus controladores de vista, las clases que son compartidos entre los dispositivos iPhone y iPad necesita incluir macros condicionales de compilación a código de dispositivo específico aislado. Aunque también se podría utilizar controles de tiempo de ejecución para determinar si se dispusiera de clases o métodos específicos, ello no haría sino aumentar el tamaño de su ejecutable mediante la adición de rutas de código que no se siguieron en un dispositivo o la otra. Dejar que el compilador eliminar este código ayuda a mantener el código más limpio.

Sin embargo, no hay ningún lugar que pude encontrar información más específica acerca de las macros de compilación condicional.

Para múltiples objetivos que comparten el mismo proyecto / código, que estoy haciendo esto mediante la edición de las banderas C para mi objetivo iPad.

Con el [miaplicacion] -iPad objetivo elegido como el objetivo activo, recoger Proyecto -> Editar destino de Active [miaplicacion] -iPad. Búsqueda de "banderas c" y haga doble clic. Añadir una bandera de "-D TARGET_IPAD". Ahora el TARGET_IPAD símbolo se define únicamente para su objetivo iPad.

Por supuesto, esto sólo funciona si está utilizando objetivos separados para iPad y iPhone. Si se está ejecutando el mismo binario tanto, obviamente, no hay nada que el compilador puede hacer por usted. (Sin embargo, el SDK 3.2 a partir de finales de enero ni siquiera el apoyo universal todavía Apps.)

(Edited;. Estaba confundido acerca de la terminología de "Universal" aplicaciones etc)

O -> sólo para estar seguro

-(BOOL)isDeviceAniPad
{   
#if __IPHONE_OS_VERSION_MIN_REQUIRED >= 30200
 BOOL deviceIsPad = ([[UIDevice currentDevice] userInterfaceIdiom] == UIUserInterfaceIdiomPad);
 return deviceIsPad;
#endif
 return NO;
}

Creo que esto va a hacer

-(BOOL)isDeviceAniPad
{   
#if __IPHONE_OS_VERSION_MIN_REQUIRED >= 30200
  return ([[UIDevice currentDevice] userInterfaceIdiom] == UIUserInterfaceIdiomPad);
#endif
  return NO;
}
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top