Как получить значения RGB из UIColor? - PullRequest
91 голосов
/ 13 января 2009

Я создаю цветной объект, используя следующий код.

curView.backgroundColor = [[UIColor alloc] initWithHue:229 saturation:40 brightness:75 alpha:1];

Как получить значения RGB из созданного цветового объекта?

Ответы [ 14 ]

116 голосов
/ 21 октября 2011

В iOS 5 вы можете использовать:

CGFloat red = 0.0, green = 0.0, blue = 0.0, alpha =0.0;
[multipliedColor getRed:&red green:&green blue:&blue alpha:&alpha];
83 голосов
/ 13 января 2009
const CGFloat *colors = CGColorGetComponents( curView.backgroundColor.CGColor );

Эти ссылки предоставляют дополнительную информацию:

35 голосов
/ 20 января 2016

SWIFT 3 & 4

Я обнаружил, что cgColor.components не всегда возвращает 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] }
}

Это не самый эффективный способ, поэтому я бы не стал использовать его, когда представление будет постоянно перерисовываться.

11 голосов
/ 11 июля 2014

Надеюсь, это будет полезно

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);
7 голосов
/ 23 января 2014

Только что создал для этого категорию.

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 .

5 голосов
/ 15 июня 2013
 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];
5 голосов
/ 13 января 2009
const float* colors = CGColorGetComponents( curView.backgroundColor.CGColor );

Спасибо. Я должен был добавить const в начале строки, поскольку это генерировало предупреждение.

2 голосов
/ 08 ноября 2016

Версия Дэвида Риса Swift 3:

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]
    }
}
1 голос
/ 02 мая 2016

Начиная с iOS 2.0, в UIColor существует частный метод экземпляра, называемый styleString, который возвращает строковое представление цвета RGB или RGBA, даже для цветов, таких как whiteColor, вне пространства RGB.

Objective-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 вы можете использовать мостовой заголовок для отображения интерфейса. В чистом 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)
0 голосов
/ 07 декабря 2018

Топ проголосовавший ответ устарел:

ошибка:: 3: 1: ошибка: «CGColorGetComponents» заменено на свойство «CGColor.components»

Вместо этого используйте

myUIColor.cgColor.components

...