كيفية الحصول على قيم RGB من UIColor؟
سؤال
أقوم بإنشاء كائن ملون باستخدام الكود التالي.
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 ... ولكن بالتأكيد هناك طريقة من هذا القبيل في سريعة.