2011-05-21 10 views
8

Estoy tratando de hacer que mi aplicación de iPhone sea compatible con el iPad. En un archivo de cabecera, configuré algunas constantes. Debido a la pantalla más grande, quiero que se usen algunas constantes para que las imágenes sean más grandes en el iPad que en el iPhone. he encontrado algunas sugerencias sobre el Internet para lograr esto:#define según la plataforma [iPhone o iPad]

#if (UI_USER_INTERFACE_IDIOM() == UIUserInterfaceIdiomPad) 
#define imgAmcWidth 656.0f 
#define imgAmcHeight 36.0f 
#else 
#define imgAmcWidth 240.0f 
#define imgAmcHeight 20.0f 
#endif 

Esto parece satisfacer mis necesidades. Desafortunadamente xcode 4 no puede compilar esto dando un error: 'Token' ["no es válido en el preprocesador .. '[LLVM GCC 4.2]. ¿Qué estoy haciendo mal?

Respuesta

5

UI_USER_INTERFACE_IDIOM y UIUserInterfaceIdiomPad no son cosas del preprocesador. Son parte de iOS, por lo que debe hacer:

if (UI_USER_INTERFACE_IDIOM() == UIUserInterfaceIdiomPad) { 
    <define your constants here> 
} else { 
    <define your constants here> 
} 

Ver también this si va a apoyar versiones IOS anteriores a 3.2

+0

Thx - eso es lo que yo pensaba. Pero este método no permite compartir las constantes entre clases, ¿verdad? – Ghislain

22

Aunque probablemente no sea la solución más elegante sino para evitar una reescritura importante de la código Decidí usar el siguiente truco:

#define iPad UI_USER_INTERFACE_IDIOM() == UIUserInterfaceIdiomPad 
#define imgAmcWidth   (iPad ? 639.0f : 240.0f) 
// etc.. 
+2

Debe poner paréntesis alrededor de su definición de macro, o puede terminar con precedencia extraña o errores de desajuste de operando. Los paréntesis hacen que sus macros sean "seguras" para usar en más contextos. – Dalbergia

+0

Si este método se usa para constantes a las que se hace referencia en gran cantidad, ralentizará la aplicación un montón. – Letrstotheprez