iphone - Objetivo C definiendo constantes UIColor
objective-c constants (7)
Tengo una aplicación para iPhone con algunos colores personalizados para mi tema. Dado que estos colores serán fijos para mi interfaz de usuario, me gustaría definir los colores en una clase que se incluirá (Constantes.h y Constantes.m). ¿Cómo puedo hacer eso? (El simple hecho de definirlos no funciona porque los UIColors son mutables y podrían causar errores: Initalizer no es constante).
/* Constants.h */
extern UIColor *test;
/* Constants.m */
UIColor *test = [UIColor colorWithRed:1.0 green:1.0 blue:1.0 alpha:1.0];
¡Gracias!
A menudo, las personas ponen constantes globales en objetos singleton, o como se señala en la nota anterior, puede hacerlos accesibles a través de un método de clase de alguna clase.
Aquí hay otra manera:
Encabezamiento:
#if !defined(COLORS_EXTERN)
#define COLORS_EXTERN extern
#endif
COLORS_EXTERN UIColor *aGlobalColor;
Implementación:
#define COLORS_EXTERN
#import "GlobalColors.h"
@interface GlobalColors : NSObject
@end
@implementation GlobalColors
+ (void)load
{
aGlobalColor = [UIColor colorWithRed:0.2 green:0.3 blue:0.4 alpha:1];
}
@end
Es un poco difícil, pero no es necesario redefinir el color en la implementación y puede acceder a los colores sin una llamada de método.
Otra opción
en tu .h puedes hacer
extern UIColor * const COLOR_LIGHT_BLUE;
en tu .mm puedes hacer
UIColor* const COLOR_LIGHT_BLUE = [[UIColor alloc] initWithRed:21.0f/255 green:180.0f/255 blue:1 alpha:1];//;#15B4FF
Por simplicidad hice esto:
/* Constants.h */
#define myColor [UIColor colorWithRed:255.0/255.0 green:255.0/255.0 blue:255.0/255.0 alpha:1.0]
No te olvides de dejar fuera el '';'' por lo que puede utilizarlo como una expresión normal.
No estoy seguro de que exista algún problema técnico con este enfoque, pero funciona bien y evita el error de inicialización constante en tiempo de compilación: este código está efectivamente atascado en cualquier lugar donde coloque ''myColor'', por lo que nunca se pone compilado hasta que realmente lo use.
Si estás buscando una rápida y sucia sin extensiones, clang :
#define kGreenColor colorWithRed:(0/255.0) green:(213/255.0) blue:(90/255.0) alpha:1.0
- (void)doSomething
{
_label.textColor = [UIColor kGreenColor];
}
Un UIColor no es mutable. Por lo general hago esto con colores, fuentes e imágenes. Podría modificarlo fácilmente para usar singletons o tener un inicializador estático.
@interface UIColor (MyProject)
+(UIColor *) colorForSomePurpose;
@end
@implementation UIColor (MyProject)
+(UIColor *) colorForSomePurpose { return [UIColor colorWithRed:0.6 green:0.8 blue:1.0 alpha:1.0]; }
@end
Utilice AppController para hacer que los colores sean accesibles globalmente, en lugar de una variable estática. De esa manera, tiene sentido desde el punto de vista de la arquitectura, y también si quisiera hipotéticamente cambiar los esquemas de color, incluso mientras se ejecuta, esto solo sería un método o dos en el AppController