¿Cómo conseguir los componentes de color de una CGColor correctamente
-
08-10-2019 - |
Pregunta
Tengo un UILabel con el color negro;
estoy escribiendo el siguiente código para obtener los componentes de color de negro.
UIColor *aColor = [aLabel.textColor retain];
const CGFloat* components = CGColorGetComponents(aColor.CGColor);
CGColorSpaceRef colorSpace=CGColorSpaceCreateDeviceRGB();
pero siempre se trata de dar a los componentes de color verde en lugar de componentes de color negro;
¿Está alguno tienen idea acerca de esto?
¿Estoy pasando espacio de color diferente?
:-( me ayude por favor.
Solución
La mayor espacio de color equivocado probable. Creo que el componente alfa del espacio de color en escala de grises lleva a donde cree que el componente verde debe ser.
I utilizar esta función para crear una cadena de UIColor, I único encuentro espacios de color RGB y en escala de grises, así que sólo interpretar cada color con menos de 4 componentes (R + G + B + A) como escala de grises.
if (CGColorGetNumberOfComponents(color.CGColor) < 4) {
const CGFloat *components = CGColorGetComponents(color.CGColor);
color = [UIColor colorWithRed:components[0] green:components[0] blue:components[0] alpha:components[1]];
}
if (CGColorSpaceGetModel(CGColorGetColorSpace(color.CGColor)) != kCGColorSpaceModelRGB) {
NSLog(@"no rgb colorspace");
// do seomthing
}
const CGFloat *components = CGColorGetComponents(color.CGColor);
NSString *colorAsString = [NSString stringWithFormat:@"%f,%f,%f,%f", components[0], components[1], components[2], components[3]];
Por supuesto este método no es ahorrar para todos los casos, se debe adoptar a sus necesidades específicas.
Otros consejos
La razón por la que está viendo lo que parece ser r=0
, g=1
, b=0
, a=0
es porque estás mal interpretando los valores de la matriz devuelta como en un modelo de color RGB
. UIColor
usos monocromática espacio de color colores en escala de grises como negro en este caso.
Lo que está viendo es un conjunto de componentes 2
de un blanco y negro modelo de color . La primera es nivel de gris (0
para el negro) y el segundo es alfa (1
para opaco). Los dos últimos valores están mirando su están fuera de la final de la matriz elemento 2
y resultan ser 0
en este caso.
Se dará cuenta de si el color es negro y se intenta CGColorGetNumberOfComponents(color.CGColor)
, devuelve 2
. Y si se intenta CGColorSpaceGetModel(CGColorGetColorSpace(color.CGColor))
, devuelve 0
que corresponde a kCGColorSpaceModelMonochrome
(véase la enumeración en CGColorSpaceModel
CGColorSpace.h
)
creo que esto es una muy buena manera de obtener la representación RGB de cualquier UIColor *, que ya cuenta con un método de conveniencia para retener Está componentes.
-(CGColorRef)CGColorRefFromUIColor:(UIColor*)newColor {
CGFloat components[4] = {0.0,0.0,0.0,0.0};
[newColor getRed:&components[0] green:&components[1] blue:&components[2] alpha:&components[3]];
CGColorRef newRGB = CGColorCreate(CGColorSpaceCreateDeviceRGB(), components);
return newRGB;
}
Una forma de obtener RGB para éstos es dibujando el color en un contexto gráfico y leer la parte de atrás de color. Véase mi respuesta a esta pregunta, por ejemplo, código:
ejemplo de trabajo con UIColor:
CALayer * btnLayer = [myLittleButton layer];
[layer setBackgroundColor:<#(CGColorRef)#>]
se convierte en: [btnLayer setBorderColor:[[UIColor grayColor] CGColor]];
sólo asegúrese de que los botones de colores originales doesnt cubrir la capa