2009-09-30 18 views
49

Me estoy haciendo un UIColor volvió de este método:¿Cómo obtengo el azul verde rojo y el alfa de un objeto UIColor?

- (UIColor *)getColor { 
return [UIColor colorWithRed:redSlider.value green:greenSlider.value blue:blueSlider.value alpha:1.0]; 
} 

y conseguir el color de esta manera:

SelectedColor=[(ColorPickerView *)alertView getColor]; 

Ahora quiero conseguir rojo, verde, azul de selectedColor, con el fin de utilizar los valores. Quiero valores entre 0 y 1. Además, cuando uso SelectedColor.CGColor, mi aplicación se cuelga.

+8

Una nota al costado; deberías ver las convenciones de nombres. 'getColor' es malo por dos razones: primero utiliza el prefijo get que es un error común para Java-devs, en segundo lugar no describe qué tipo de color es. Un nombre mejor es probablemente 'userSelectedColor'.Mira cómo obtienen los nombres UIKit, y las propiedades, y haz lo mismo. – PeyloW

Respuesta

107

La razón de la caída cuando se accede a SelectedColor.CGColor podría ser que no conserve el resultado de getColor, tal vez lo que necesita es:

SelectedColor = [[(ColorPickerView *)alertView getColor] retain]; 

solamente puede recibir el componente de color RGB desde un UIColor que es utilizando el espacio de color RGB, ya que está usando colorWithRed:green:blue:alpha: que no es un problema, pero puede variar de esto si su código cambia.

Con esto en mente a encontrar las componentes de color es muy fácil:

const CGFloat* components = CGColorGetComponents(SelectedColor.CGColor); 
NSLog(@"Red: %f", components[0]); 
NSLog(@"Green: %f", components[1]); 
NSLog(@"Blue: %f", components[2]); 
NSLog(@"Alpha: %f", CGColorGetAlpha(SelectedColor.CGColor)); 
+0

gracias PeyloW.¿Sabes sobre enmascaramiento de imagen en ihpone? –

+0

Como enmascarar esquinas redondeadas y cosas así? Claro, agrega una nueva pregunta. – PeyloW

+0

¡Hola PeyloW! He usado el mismo pero está dando los componentes de color verde cuando paso el color negro. ¿sabes por qué sucede esto? Puedes ver mi publicación aquí también-> http://stackoverflow.com/questions/4155642/how-to-get-color-components-of-a-cgcolor-correctly – Ganesh

4

Creo que debería tener un a look here, donde la guía de Ars muestra cómo extender la clase UIColor con ayuda para acceder a los componentes de color.

1

Este fragmento de código debería funcionar tanto con RGB y en escala de grises:

CGFloat *components = (CGFloat *) CGColorGetComponents(<UIColor instance>.CGColor); 
if(CGColorGetNumberOfComponents(<UIColor instance>.CGColor) == 2) 
{ 
    //assuming it is grayscale - copy the first value 
    components[2] = components[1] = components[0]; 
} 
22

Esta solución funciona para los colores no son RGB también por ejemplo color blanco o negro

UIColor *color = [UIColor blackColor]; 
CGFloat red = 0.0, green = 0.0, blue = 0.0, alpha = 0.0; 
// iOS 5 
if ([color respondsToSelector:@selector(getRed:green:blue:alpha:)]) { 
    [color getRed:&red green:&green blue:&blue alpha:&alpha]; 
} else { 
    // < iOS 5 
    const CGFloat *components = CGColorGetComponents(color.CGColor); 
    red = components[0]; 
    green = components[1]; 
    blue = components[2]; 
    alpha = components[3]; 
} 

// This is a non-RGB color 
if(CGColorGetNumberOfComponents(color.CGColor) == 2) { 
    CGFloat hue; 
    CGFloat saturation; 
    CGFloat brightness; 
    [color getHue:&hue saturation:&saturation brightness:&brightness alpha:&alpha]; 

} 
+0

El bloque de código "non-RGB" también es iOS5 +. Es posible que desee marcarlo como tal. –

7

En la mayoría de los casos esto funcionará, a menos que la conversión a RGB no funcione.

float red, green, blue, alpha; 
BOOL conversionToRGBWentOk = [color getRed:&red green:&green blue:&blue alpha:&alpha]; 

De eso se tratan estos métodos, de hecho. Si el conversionToRGBWentOk es NO, tendrá un problema.

+1

Gracias, la tuya fue la mejor solución que jamás haya visto. –

+1

Pero causa un bloqueo en mi simulador ios4.3. Es compatible con IOS5 +. –

2

que acaba de hacer esto simples

CGFloat red,green,blue,alpha; 

[UIColorobject getRed:&red green:&green blue:&blue alpha:&alpha]; 

en rojo, verde, azul y alfa se obtiene el valor RGB si usted tiene alguna pregunta por favor pregunte ...

Gracias

+0

Dos personas ya publicaron ese código ... – nschum

0

Sólo tiene que añadir la propiedad ColorLiteral como se muestra en el ejemplo. Xcode le solicitará una lista completa de colores que puede elegir.

self.view.backgroundColor = ColorLiteral 
0

Creo que esto sería un camino a seguir. Si necesita usar parámetros alfa también, puede interpolar alfa de entrada como lo hace para R G y B.

- (UIColor *)getColorBetweenColor:(UIColor *)color1 andColor:(UIColor *)color2 percentage:(CGFloat)percent { 
    CGFloat red1, green1, blue1, alpha1; 
    CGFloat red2, green2, blue2, alpha2; 

    [color1 getRed:&red1 green:&green1 blue:&blue1 alpha:&alpha1]; 
    [color2 getRed:&red2 green:&green2 blue:&blue2 alpha:&alpha2]; 

    double resultRed = red1 + percent * (red2 - red1); 
    double resultGreen = green1 + percent * (green2 - green1); 
    double resultBlue = blue1 + percent * (blue2 - blue1); 

    return [UIColor colorWithRed:resultRed green:resultGreen blue:resultBlue alpha:1]; 
} 
Cuestiones relacionadas