Как получить значения RGB от UIColor?
Я создаю цветной объект, используя следующий код.
curView.backgroundColor = [[UIColor alloc] initWithHue:229 saturation:40 brightness:75 alpha:1];
Как я могу получить значения RGB из созданного объекта цвета?
13 ответов:
const CGFloat *colors = CGColorGetComponents( curView.backgroundColor.CGColor );
эти ссылки предоставляют дополнительную информацию:
в iOS 5 Вы можете использовать:
CGFloat red = 0.0, green = 0.0, blue = 0.0, alpha =0.0; [multipliedColor getRed:&red green:&green blue:&blue alpha:&alpha];
SWIFT 3 & 4
Я нашел этот cgColor.компоненты не всегда возвращают 4 значения цвета, поэтому я изменил это, чтобы он получал их из обертки 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] } }
это не самый эффективный способ, поэтому я бы не стал использовать это, где вид будет постоянно перерисовываться.
надеюсь, это будет полезным
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);
просто сделал категорию для этого.
NSLog(@"%f", [UIColor blueColor].blue); // 1.000000
идет что-то вроде:
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
часть
eppz!kit
С UIColor вкусности.
const float* colors = CGColorGetComponents( curView.backgroundColor.CGColor );
спасибо. Я должен был добавить
const
в начале строки, как он генерировал предупреждение.
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];
Swift 3 версия 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] } }
начиная с iOS 2.0 существует частный метод экземпляра на
UIColor
под названиемstyleString
который возвращает строковое представление RGB или RGBA цвета, даже для таких цветов, как whiteColor за пределами пространства RGB.Цель-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)
в Swift вы можете использовать заголовок моста для отображения интерфейса. С помощью pure Swift вам нужно будет создать
@objc
протокол с частным методом, аunsafeBitCast
UIColor
С протоколом:@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)
Я хотел получить цвет фона
UITableViewStyle
"UITableViewStyleGrouped" так вviewDidAppear:
метод я добавил код:
NSLog(@"%@", self.tableView.backgroundView.backgroundColor);
Он сделал то, что я ожидал, и вернулся в журнал:
UIDeviceRGBColorSpace 0.937255 0.937255 0.956863 1
так что вкратце просто введите
NSLog(@"%@", [UIColor whateverColor]);
используя HandyUIKit делает очень просто:
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
существует также аналогичная опция get
hsba
значения: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
просто установите его с помощью Carthage и вы хорошо идти.
Я надеюсь, что это помогает!
некоторые полезные макросы, которые я сделал для этого и других элементов управления цветом:
в вашем случае вы бы просто использовать
getRGBA(myColor, red, green, blue, alpha); NSLog(@"Red Value: %f", red); NSLog(@"Blue Value: %f", green); NSLog(@"Green Value: %f", blue);
макросы:
#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;\ })()\ ) */