2012-02-11 8 views
17

Cuando llamo a CGColorGetComponents con el CGColor devuelto desde un UIColor, parece que funciona correctamente excepto con blanco y negro.¿Hay algún problema con CGColorGetComponents?

Aquí está el código ...

CGColorRef myColorRef = [[UIColor whiteColor] CGColor]; 

const CGFloat * colorComponents = CGColorGetComponents(myColorRef); 

NSLog(@"r=%f, g=%f, b=%f, a=%f", 
    colorComponents[0], 
    colorComponents[1], 
    colorComponents[2], 
    colorComponents[3]); 

Esto registra

r=1.000000, g=1.000000, b=0.000000, a=0.000000 

Nota B y A son cero, no uno.

Si sustituye otros colores como redColor, blueColor, etc., funciona ... los valores RGB y A se configuran como cabría esperar. Pero, de nuevo, el blanco y el negro producen resultados extraños. ¿Hay algún problema con esta función o hay alguna solución/tarea que debería estar haciendo?

Respuesta

32

[UIColor whiteColor] y [UIColor blackColor] usan [UIColor colorWithWhite:alpha:] para crear el UIColor. Lo que significa que este CGColorRef solo tiene 2 componentes de color, no 4 como colores creados con [UIColor colorWithRed:green:blue:alpha:].

Por supuesto, también puedes NSLog.

if (CGColorGetNumberOfComponents(myColorRef) == 2) { 
    const CGFloat *colorComponents = CGColorGetComponents(myColorRef); 
    NSLog(@"r=%f, g=%f, b=%f, a=%f", colorComponents[0], colorComponents[0], colorComponents[0], colorComponents[1]); 
} 
else if (CGColorGetNumberOfComponents(myColorRef) == 4) { 
    const CGFloat * colorComponents = CGColorGetComponents(myColorRef); 
    NSLog(@"r=%f, g=%f, b=%f, a=%f", colorComponents[0], colorComponents[1], colorComponents[2], colorComponents[3]); 
} 
else { 
    NSLog(@"What is this?"); 
} 

Tenga en cuenta que existen diferentes espacios de color también. Por lo tanto, si necesita este código para algo más que el registro (por ejemplo, para guardar cadenas de RGBA en json), debe verificar (y probablemente convertir) también el colorSpace.

+0

Ok, comenzando desde un UIColor, ¿cómo se configuran fácilmente los colores actuales de relleno y trazo, o tenemos que hacer lo que acabamos de hacer cada vez que tenemos que hacer esto? (En cuanto a los espacios de color, solo me interesan los valores de RGBA establecidos entre 0.0 y 1.0 y que se muestran en la pantalla. Cualquier otra cosa estará fuera del alcance de lo que estamos haciendo) – MarqueIV

+2

para un CGContextRef? simplemente use 'CGContextSetStrokeColorWithColor (context, [UIColor whiteColor] .CGColor);' –

+0

Además, ¿qué es 'color.CGColor' en su código? ¿Es eso diferente a 'myColorRef'? – MarqueIV

Cuestiones relacionadas