سؤال

أقوم بإنشاء كائن ملون باستخدام الكود التالي.

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

كيف يمكنني استرداد قيم RGB من كائن اللون الذي تم إنشاؤه؟

هل كانت مفيدة؟

المحلول

const CGFloat *colors = CGColorGetComponents( curView.backgroundColor.CGColor );

توفر هذه الروابط مزيدًا من التفاصيل:

نصائح أخرى

في دائرة الرقابة الداخلية 5 هل يمكن استخدام:

CGFloat red = 0.0, green = 0.0, blue = 0.0, alpha =0.0;
[multipliedColor getRed:&red green:&green blue:&blue alpha:&alpha];

سويفت 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 }
}

سويفت 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];

وسويفت 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]
    }
}

ومنذ دائرة الرقابة الداخلية 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)

في سويفت هل يمكن استخدام رأس جسر لفضح واجهة. مع سويفت النقي، وسوف تحتاج إلى إنشاء بروتوكول @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

هناك أيضًا خيار مماثل لـ يحصل 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

ببساطة تثبيته باستخدام قرطاج وأنت على ما يرام.

اتمني ان يكون مفيدا!

وبعض وحدات الماكرو مفيدة لقد قدمت لهذه وغيرها من الضوابط اللون:

في قضيتك يمكنك استخدام فقط

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;\
})()\
)
*/
وعفا عليها الزمن

والجزء العلوي صوت الجواب:

<اقتباس فقرة>   

والخطأ:: 3: 1: الخطأ: 'CGColorGetComponents' حلت محلها "CGColor.components" الملكية

وبدلا من ذلك، استخدم

وmyUIColor.cgColor.components

ووضع UIColor الخاصة بك مثل هذا

UIColor.FromRGB(128, 179, 255)

وهذا هو لدائرة الرقابة الداخلية Xamarin ... ولكن بالتأكيد هناك طريقة من هذا القبيل في سريعة.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top