¿Cómo obtener valores RGB de UIColor?
Pregunta
Estoy creando un objeto de color usando el siguiente código.
curView.backgroundColor = [[UIColor alloc] initWithHue:229 saturation:40 brightness:75 alpha:1];
¿Cómo puedo recuperar los valores RGB del objeto de color creado?
Solución
const CGFloat *colors = CGColorGetComponents( curView.backgroundColor.CGColor );
Estos enlaces proporcionan más detalles:
Otros consejos
En iOS 5 podría usar:
CGFloat red = 0.0, green = 0.0, blue = 0.0, alpha =0.0;
[multipliedColor getRed:&red green:&green blue:&blue alpha:&alpha];
SWIFT 3 & amp; 4
Descubrí que cgColor.components no siempre devuelve 4 valores de color, así que cambié esto para que los obtenga de un contenedor CIColor
extension UIColor {
var redValue: CGFloat{ return CIColor(color: self).red }
var greenValue: CGFloat{ return CIColor(color: self).green }
var blueValue: CGFloat{ return CIColor(color: self).blue }
var alphaValue: CGFloat{ return CIColor(color: self).alpha }
}
SWIFT 2
extension UIColor {
var red: CGFloat{ return CGColorGetComponents(self.CGColor)[0] }
var green: CGFloat{ return CGColorGetComponents(self.CGColor)[1] }
var blue: CGFloat{ return CGColorGetComponents(self.CGColor)[2] }
var alpha: CGFloat{ return CGColorGetComponents(self.CGColor)[3] }
}
No es la forma más eficiente, así que no usaría esto donde una vista se volverá a dibujar constantemente.
Espero que esto sea útil
CGFloat red, green, blue, alpha;
//Create a sample color
UIColor *redColor = [UIColor redColor];
//Call
[redColor getRed: &red
green: &green
blue: &blue
alpha: &alpha];
NSLog(@"red = %f. Green = %f. Blue = %f. Alpha = %f",
red,
green,
blue,
alpha);
Acabo de hacer una categoría para esto.
NSLog(@"%f", [UIColor blueColor].blue); // 1.000000
Va ??algo así como:
typedef enum { R, G, B, A } UIColorComponentIndices;
@implementation UIColor (EPPZKit)
-(CGFloat)red
{ return CGColorGetComponents(self.CGColor)[R]; }
-(CGFloat)green
{ return CGColorGetComponents(self.CGColor)[G]; }
-(CGFloat)blue
{ return CGColorGetComponents(self.CGColor)[B]; }
-(CGFloat)alpha
{ return CGColorGetComponents(self.CGColor)[A]; }
@end
Parte de eppz!kit
con más UIColor goodies .
const float* colors = CGColorGetComponents( curView.backgroundColor.CGColor );
Gracias. Tuve que agregar el const
al comienzo de la línea ya que generaba una advertencia.
UIColor *color = [[UIColor greenColor] retain]; //line 1
//OR(You will have color variable either like line 1 or line 2)
color = curView.backgroundColor;//line 2
CGColorRef colorRef = [color CGColor];
int _countComponents = CGColorGetNumberOfComponents(colorRef);
if (_countComponents == 4) {
const CGFloat *_components = CGColorGetComponents(colorRef);
CGFloat red = _components[0];
CGFloat green = _components[1];
CGFloat blue = _components[2];
CGFloat alpha = _components[3];
NSLog(@"%f,%f,%f,%f",red,green,blue,alpha);
}
[color release];
Respuesta de la versión Swift 3 de David Rees:
extension UIColor {
var redValue: CGFloat{
return cgColor.components! [0]
}
var greenValue: CGFloat{
return cgColor.components! [1]
}
var blueValue: CGFloat{
return cgColor.components! [2]
}
var alphaValue: CGFloat{
return cgColor.components! [3]
}
}
Desde iOS 2.0 hay un método de instancia privada en UIColor
llamado styleString
que devuelve una representación de cadena RGB o RGBA del color, incluso para colores como whiteColor fuera del RGB espacio.
Objetivo-C:
@interface UIColor (Private)
- (NSString *)styleString;
@end
// ...
[[UIColor whiteColor] styleString]; // rgb(255,255,255)
[[UIColor redColor] styleString]; // rgb(255,0,0)
[[UIColor lightTextColor] styleString]; // rgba(255,255,255,0.600000)
En Swift podría usar un encabezado de puente para exponer la interfaz. Con Swift puro, deberá crear un protocolo @objc
con el método privado y unsafeBitCast
UIColor
con el protocolo:
@objc protocol UIColorPrivate {
func styleString() -> String
}
let white = UIColor.whiteColor()
let red = UIColor.redColor()
let lightTextColor = UIColor.lightTextColor()
let whitePrivate = unsafeBitCast(white, UIColorPrivate.self)
let redPrivate = unsafeBitCast(red, UIColorPrivate.self)
let lightTextColorPrivate = unsafeBitCast(lightTextColor, UIColorPrivate.self)
whitePrivate.styleString() // rgb(255,255,255)
redPrivate.styleString() // rgb(255,0,0)
lightTextColorPrivate.styleString() // rgba(255,255,255,0.600000)
Quería obtener el color de fondo del UITableViewStyle
" UITableViewStyleGrouped " así que en el método viewDidAppear:
agregué el código:
NSLog (@ "% @ " ;, self.tableView.backgroundView.backgroundColor);
Hizo lo que esperaba y devolvió el registro:
UIDeviceRGBColorSpace 0.937255 0.937255 0.956863 1
Entonces, en resumen, simplemente escriba NSLog (@ "% @ " ;, [UIColor whateverColor]);
El uso de HandyUIKit hace que este sea realmente fácil :
import HandyUIKit
let color = UIColor(red: 0.1, green: 0.2, blue: 0.3, alpha: 0.4)
// get any of the rgba values
color.rgba.red // => 0.1
color.rgba.green // => 0.2
color.rgba.blue // => 0.3
color.rgba.alpha // => 0.4
También hay una opción similar para obtener hsba
valores :
let color = UIColor(hue: 0.1, saturation: 0.2, brightness: 0.3, alpha: 0.4)
// you can get any of the hsba values, too
color.hsba.hue // => 0.1
color.hsba.saturation // => 0.2
color.hsba.brightness // => 0.3
color.hsba.alpha // => 0.4
Simplemente instálelo usando Carthage y estará listo.
¡Espero que ayude!
Algunas macros útiles que he hecho para este y otros controles de color:
En su caso, simplemente usaría
getRGBA(myColor, red, green, blue, alpha);
NSLog(@"Red Value: %f", red);
NSLog(@"Blue Value: %f", green);
NSLog(@"Green Value: %f", blue);
Macros:
#define rgba(r,g,b,a) [UIColor colorWithRed:((float)(r))/255.0f green:((float)(g))/255.0f blue:((float)(b))/255.0f alpha:a]
#define rgb(r,g,b) rgba(r, g, b, 1.0f)
#define rgbaf(r,g,b,a) [UIColor colorWithRed:(r) green:(g) blue:(b) alpha:a]
#define rgbf(r,g,b) rgbaf(r, g, b, 1.0f)
#define rgba_fromColor(__color, __r, __g, __b, __a) \
CGFloat __r, __g, __b, __a;\
UIColor *__unpackedColor = [NSKeyedUnarchiver unarchiveObjectWithData:[NSKeyedArchiver archivedDataWithRootObject:__color]];/*Bring system colors into compatible color-space (e.g. DarkGrayColor)*/\
[__unpackedColor getRed:&__r green:&__g blue:&__b alpha:&__a];
#define getRGBA(__color, __r, __g, __b, __a) hsba_fromColor(__color, __r, __g, __b, __a)
#define getRed(__color) (\
(^float (void){\
rgba_fromColor(__color, r, g, b, a);\
return r;\
})()\
)
#define getGreen(__color) (\
(^float (void){\
rgba_fromColor(__color, r, g, b, a);\
return g;\
})()\
)
#define getBlue(__color) (\
(^float (void){\
rgba_fromColor(__color, r, g, b, a);\
return b;\
})()\
)
#define getAlpha(__color) (\
(^float (void){\
rgba_fromColor(__color, r, g, b, a);\
return a;\
})()\
)
#define hsba(h,s,b,a) [UIColor colorWithHue:((float)(h))/360.0f saturation:((float)(s))/100.0f brightness:((float)(b))/100.0f alpha:a]
#define hsb(h,s,b) hsba(h, s, b, 1.0f)
#define hsbaf(h,s,b,a) [UIColor colorWithHue:(h) saturation:(s) brightness:(b) alpha:a]
#define hsbf(h,s,b) rgbaf(h, s, b, 1.0f)
#define hsba_fromColor(__color, __h, __s, __b, __a) \
CGFloat __h, __s, __b, __a;\
UIColor *__unpackedColor = [NSKeyedUnarchiver unarchiveObjectWithData:[NSKeyedArchiver archivedDataWithRootObject:__color]];/*Bring system colors into compatible color-space (e.g. DarkGrayColor)*/\
[__unpackedColor getHue:&__h saturation:&__s brightness:&__b alpha:&__a];
#define getHSBA(__color, __h, __s, __b, __a) rgba_fromColor(__color, __h, __s, __b, __a)
#define getHue(__color) (\
(^float (void){\
hsba_fromColor(__color, h, s, b, a);\
return h;\
})()\
)
#define getSaturation(__color) (\
(^float (void){\
hsba_fromColor(__color, h, s, b, a);\
return s;\
})()\
)
#define getBrightness(__color) (\
(^float (void){\
hsba_fromColor(__color, h, s, b, a);\
return b;\
})()\
)
/*
///already defined in RGBA macros
#define getAlpha(__color) (\
(^float (void){\
hsba_fromColor(__color, h, s, b, a);\
return a;\
})()\
)
*/
La respuesta más votada no está actualizada:
error:: 3: 1: error: 'CGColorGetComponents' ha sido reemplazado por la propiedad 'CGColor.components'
En su lugar, use
myUIColor.cgColor.components
configura tu UIColor de esta manera
UIColor.FromRGB(128, 179, 255)
esto es para Xamarin ios ... pero seguro que hay un método como este en Swift.