objective c - hexadecimal - ¿Es Macro mejor que UIColor para configurar el color RGB?
uicolor ios (7)
Imho el método UIcolor es más legible. Creo que los macro son geniales si resuelven un problema; es decir, proporcionar más rendimiento y / o código legible.
No me queda claro cuál es la ventaja de utilizar una macro en este caso, por lo que preferiría la segunda opción.
Tengo esta macro en mi archivo de encabezado:
#define UIColorFromRGB(rgbValue) /
[UIColor colorWithRed:((float)((rgbValue & 0xFF0000) >> 16))/255.0 /
green:((float)((rgbValue & 0xFF00) >> 8))/255.0 /
blue:((float)(rgbValue & 0xFF))/255.0 /
alpha:1.0]
Y estoy usando esto como algo así en mi archivo .m:
cell.textColor = UIColorFromRGB(0x663333);
Entonces quiero preguntarles a todos si esto es mejor o debería usar este enfoque:
cell.textColor = [UIColor colorWithRed:66/255.0
green:33/255.0
blue:33/255.0
alpha:1.0];
¿Cuál es el mejor enfoque?
Normalmente recomiendo funciones en lugar de #defines complejos. Si la línea entrante tiene un beneficio real, el compilador generalmente lo hará por usted. #defines dificultan la depuración, especialmente cuando son complejas (y esta es).
Pero no hay nada malo con el uso de una función aquí. El único detalle que diría es que deberías usar CGFloat en lugar de flotar, pero no hay nada de malo con la notación hexadecimal si es más cómodo para ti. Si tiene muchos de estos, puedo ver dónde puede ser conveniente usar la notación de color Web. Pero evita las macros.
Tenga en cuenta que 33! = 0x33. El primero es la notación decimal y el segundo es hexadecimal. Ambos son válidos, pero son diferentes. Tu segunda opción debería leer
cell.textColor = [UIColor colorWithRed:0x66/255.0
green:0x33/255.0
blue:0x33/255.0
alpha:1.0];
o
cell.textColor = [UIColor colorWithRed:102/255.0
green:51/255.0
blue:51/255.0
alpha:1.0];
Un término medio podría ser su mejor opción. Podría definir una función normal C u objetivo C para hacer lo que su macro está haciendo ahora:
// As a C function:
UIColor* UIColorFromRGB(NSInteger rgbValue) {
return [UIColor colorWithRed:((float)((rgbValue & 0xFF0000) >> 16))/255.0
green:((float)((rgbValue & 0xFF00) >> 8))/255.0
blue:((float)(rgbValue & 0xFF))/255.0
alpha:1.0];
}
// As an Objective-C function:
- (UIColor *)UIColorFromRGB:(NSInteger)rgbValue {
return [UIColor colorWithRed:((float)((rgbValue & 0xFF0000) >> 16))/255.0
green:((float)((rgbValue & 0xFF00) >> 8))/255.0
blue:((float)(rgbValue & 0xFF))/255.0
alpha:1.0];
}
Sin embargo, si decides quedarte con la macro, deberías poner paréntesis alrededor de rgbValue
donde aparezca. Si decido llamar a tu macro con:
UIColorFromRGB(0xFF0000 + 0x00CC00 + 0x000099);
puede tener problemas.
El último bit de código es, sin duda, el más legible, pero probablemente el menos portátil: no puede llamarlo simplemente desde cualquier lugar de su programa.
Con todo, sugiero refacturar su macro en una función y dejándola así.
¿Qué hay de la creación de su cuenta?
#define RGB(r, g, b) /
[UIColor colorWithRed:(r)/255.0 green:(g)/255.0 blue:(b)/255.0 alpha:1]
#define RGBA(r, g, b, a) /
[UIColor colorWithRed:(r)/255.0 green:(g)/255.0 blue:(b)/255.0 alpha:(a)]
Entonces úsalo:
cell.textColor = RGB(0x66, 0x33, 0x33);
Parece lo suficientemente simple de usar, utiliza valores hexadecimales para los colores y sin necesidad de una sobrecarga de cálculo adicional.
Nice Marius, pero para compilar tuve que deshacerme del paréntesis, de la siguiente manera (de lo contrario, Objective C lo toma literalmente y obtienes un error de compilación de sintaxis:
#define RGB(r,g,b) [UIColor colorWithRed:r/255.0 green:g/255.0 blue:b/255.0 alpha:1.0]
...
NSArray *palette;
...
palette = [NSArray arrayWithObjects:
RGB(0,0,0),
RGB(255,0,0), // red
...
o crea una categoría separada, por lo que solo necesitas importar un archivo .h:
@interface UIColor (util)
+ (UIColor *) colorWithHexString:(NSString *)hex;
+ (UIColor *) colorWithHexValue: (NSInteger) hex;
@end
y
#import "UIColor-util.h"
@implementation UIColor (util)
// Create a color using a string with a webcolor
// ex. [UIColor colorWithHexString:@"#03047F"]
+ (UIColor *) colorWithHexString:(NSString *)hexstr {
NSScanner *scanner;
unsigned int rgbval;
scanner = [NSScanner scannerWithString: hexstr];
[scanner setCharactersToBeSkipped:[NSCharacterSet characterSetWithCharactersInString:@"#"]];
[scanner scanHexInt: &rgbval];
return [UIColor colorWithHexValue: rgbval];
}
// Create a color using a hex RGB value
// ex. [UIColor colorWithHexValue: 0x03047F]
+ (UIColor *) colorWithHexValue: (NSInteger) rgbValue {
return [UIColor colorWithRed:((float)((rgbValue & 0xFF0000) >> 16))/255.0
green:((float)((rgbValue & 0xFF00) >> 8))/255.0
blue:((float)(rgbValue & 0xFF))/255.0
alpha:1.0];
}
@end