Tôi đang tạo một đối tượng màu bằng đoạn mã sau.
curView.backgroundColor = [[UIColor alloc] initWithHue:229 saturation:40 brightness:75 alpha:1];
Làm cách nào để lấy các giá trị RGB từ đối tượng màu đã tạo?
Tôi đang tạo một đối tượng màu bằng đoạn mã sau.
curView.backgroundColor = [[UIColor alloc] initWithHue:229 saturation:40 brightness:75 alpha:1];
Làm cách nào để lấy các giá trị RGB từ đối tượng màu đã tạo?
Câu trả lời:
const CGFloat *colors = CGColorGetComponents( curView.backgroundColor.CGColor );
Các liên kết này cung cấp thêm chi tiết:
colors
, bạn có thể viết một cái gì đó như thế này,CGFloat red = colors[0];
error: <EXPR>:3:1: error: 'CGColorGetComponents' has been replaced by property 'CGColor.components'
Trong iOS 5, bạn có thể sử dụng:
CGFloat red = 0.0, green = 0.0, blue = 0.0, alpha =0.0;
[multipliedColor getRed:&red green:&green blue:&blue alpha:&alpha];
NSKeyedArchiver
, như vậy:multipliedColor = [NSKeyedUnarchiver unarchiveObjectWithData:[NSKeyedArchiver archivedDataWithRootObject: multipliedColor]];
SWIFT 3 & 4
Tôi nhận thấy rằng cgColor.components không phải lúc nào cũng trả về 4 giá trị màu, vì vậy tôi đã thay đổi điều này để nó lấy chúng từ trình bao bọc 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] }
}
Đó không phải là cách hiệu quả nhất vì vậy tôi sẽ không sử dụng cách này khi một chế độ xem sẽ liên tục được vẽ lại.
Hy vọng rằng điều này sẽ hữu ích
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);
Chỉ cần tạo một danh mục cho điều này.
NSLog(@"%f", [UIColor blueColor].blue); // 1.000000
Đi đến một cái gì đó như:
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
Một phần eppz!kit
với nhiều tính năng bổ sung của UIColor .
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];
Câu trả lời của David Rees phiên bản 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]
}
}
Kể từ iOS 2.0, có một phương thức phiên bản riêng UIColor
được gọi styleString
để trả về biểu diễn chuỗi RGB hoặc RGBA của màu, ngay cả đối với các màu như whiteColor bên ngoài không gian RGB.
Mục tiêu-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)
Trong Swift, bạn có thể sử dụng một tiêu đề bắc cầu để hiển thị giao diện. Với Swift thuần túy, bạn sẽ cần tạo một @objc
giao thức với phương thức riêng tư và unsafeBitCast
UIColor
với giao thức:
@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)
Câu trả lời được bình chọn nhiều nhất đã lỗi thời:
error:: 3: 1: error: 'CGColorGetComponents' đã được thay thế bằng thuộc tính 'CGColor.components'
Thay vào đó, hãy sử dụng
myUIColor.cgColor.components
Tôi muốn lấy màu nền của UITableViewStyle
"UITableViewStyleGrouped" vì vậy trong viewDidAppear:
phương pháp này, tôi đã thêm mã:
NSLog(@"%@", self.tableView.backgroundView.backgroundColor);
Nó đã làm những gì tôi dự đoán và trả lại nhật ký:
UIDeviceRGBColorSpace 0.937255 0.937255 0.956863 1
Vì vậy, trong ngắn hạn, chỉ cần nhập NSLog(@"%@", [UIColor whateverColor]);
Sử dụng HandyUIKit làm cho việc này thực sự dễ dàng :
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
Cũng có một tùy chọn tương tự để nhận hsba
các giá trị :
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
Chỉ cần cài đặt nó bằng Carthage và bạn đã sẵn sàng.
Tôi hy vọng nó sẽ giúp!
Một số macro hữu ích mà tôi đã thực hiện cho điều này và các điều khiển màu khác:
Trong trường hợp của bạn, bạn chỉ cần sử dụng
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;\
})()\
)
*/