Pregunta

Tengo esta macro en mi archivo de cabecera:

#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 como esto en mi archivo .m:

cell.textColor = UIColorFromRGB(0x663333);

Así que quiero pedir a todos es el mejor o debería utilizar 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?

¿Fue útil?

Solución

Una posición intermedia podría ser su mejor opción. Se podría definir una función regular, ya sea C o C-objetivo de hacer lo que la 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];
}

Si decide seguir con la macro, sin embargo, se debería poner paréntesis alrededor de rgbValue dondequiera que aparezca. Si decido llamar a su macro con:

UIColorFromRGB(0xFF0000 + 0x00CC00 + 0x000099);

es posible que encuentre problemas.

El último bit de código es sin duda la más legible, pero probablemente la menos portátil - no se puede llamar simplemente desde cualquier punto de su programa

.

Con todo, me gustaría sugerir refactorización su macro en una función y dejar las cosas así.

Otros consejos

o crear una categoría separada, por lo que sólo necesita 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

¿Qué hay de crear su propia:

#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)]

A continuación, utilizarlo:

cell.textColor = RGB(0x66, 0x33, 0x33);

Parece bastante simple de usar, utiliza valores hexadecimales de colores y sin necesidad de sobrecarga de cálculo adicional.

Generalmente, recomiendo funciones en lugar de #defines complejas. Si procesos en línea tiene un beneficio real, el compilador lo general lo hará por ti. #defines facilitan la depuración difícil, sobre todo cuando son complejas (y éste es).

Pero no hay nada de malo en usar una función aquí. La única pequeña crítica que yo diría es que usted debe estar usando CGFloat en lugar de flotar, pero no hay nada de malo en la notación hexadecimal si es más cómodo para usted. Si usted tiene un montón de ellos, puedo ver que el uso de la notación de color Web puede ser conveniente. Pero evita las macros.

I.m.h.o el método UIColor es más fácil de leer. Creo que de macro son grandes si resuelven un problema; es decir, proporcionar un mayor rendimiento y / o código legible.

No me queda claro cuál es la ventaja de utilizar una macro es en este caso, por lo que prefiero la segunda opción.

Tenga en cuenta que el 33! = 0x33. La primera es la notación decimal y el segundo es hexadecimal. Los dos son válidas, pero son diferentes. La 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];

Niza Marius, pero para compilar que tenía que deshacerse del paréntesis, de la siguiente manera (en caso contrario, Objective C toma literalmente y se obtiene un error de compilación 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
...
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top