Шестигранный цвет от uicolor
У меня проблема с преобразованием uicolor в hex-цвет, вот что я нашел
CGColorRef colorref = [[Colorview_ backgroundColor] CGColor];
int numComponents = CGColorGetNumberOfComponents(colorref);
if (numComponents == 4) {
const CGFloat *components = CGColorGetComponents(colorref);
int hexValue = 0xFF0000*components[0] + 0xFF00*components[1] + 0xFF*components[2];
NSString *hexString = [NSString stringWithFormat:@"#%d", hexValue];
}
этот код дает мне # 5576149 (например) для hexString, мы видим, что есть 7 цифр, а не 6, это не шестнадцатеричный цвет, любая помощь будет оценена, спасибо.
Ответы
Ответ 1
NSString *hexString = [NSString stringWithFormat:@"#%d", hexValue];
Вы форматируете его как цифру с% d
Вы хотите отформатировать его как шестнадцатеричный с% x или% X - возможно, как строка% s. Я не проверял, что делает функция, и что int hexValue
держит
d или я Подписанное десятичное целое число 392
x Неподписанное шестнадцатеричное целое число 7fa
X Неподписанное шестнадцатеричное целое число (заглавные буквы) 7FA
Ответ 2
Ответ sylphos выше не работает для darkGrayColor.
Это работает лучше (взято из http://softteco.blogspot.jp/2011/06/extract-hex-rgb-color-from-uicolor.html):
- (NSString *) hexFromUIColor:(UIColor *)color {
if (CGColorGetNumberOfComponents(color.CGColor) < 4) {
const CGFloat *components = CGColorGetComponents(color.CGColor);
color = [UIColor colorWithRed:components[0] green:components[0] blue:components[0] alpha:components[1]];
}
if (CGColorSpaceGetModel(CGColorGetColorSpace(color.CGColor)) != kCGColorSpaceModelRGB) {
return [NSString stringWithFormat:@"#FFFFFF"];
}
return [NSString stringWithFormat:@"#%02X%02X%02X", (int)((CGColorGetComponents(color.CGColor))[0]*255.0), (int)((CGColorGetComponents(color.CGColor))[1]*255.0), (int)((CGColorGetComponents(color.CGColor))[2]*255.0)];
}
Ответ 3
Я попробовал это вчера, потому что мне нужно было получить шестнадцатеричный цвет от uicolor и заставить его работать в javascript тоже, но это не работает, когда компонент равен 0, потому что он получает 0 вместо 00.
Таким образом, чистый голубой будет RGB 0 255 255, и этот код вернет # 0ffff вместо # 00ffff.
Я сделал этот код с вашего, и он работает над моим приложением:
-(NSString*)colorToHex:(UIColor*)color{
CGColorRef colorref = [color CGColor];
const CGFloat *components = CGColorGetComponents(colorref);
NSString *hexString = @"#";
int hexValue = 0;
for (int i=0; i<3; i++) {
if (components[i] == 0) {
hexString = [NSString stringWithFormat:@"%@00", hexString];
}else{
hexValue = 0xFF*components[i];
hexString = [NSString stringWithFormat:@"%@%x", hexString, hexValue];
}
}
return hexString;
}
Ответ 4
Вот версия этого, но отформатированная как функция C:
static inline NSString *hexFromUIColor(UIColor * _color) {
if (CGColorGetNumberOfComponents(_color.CGColor) < 4) {
const CGFloat *components = CGColorGetComponents(_color.CGColor);
_color = [UIColor colorWithRed:components[0] green:components[0] blue:components[0] alpha:components[1]];
}
if (CGColorSpaceGetModel(CGColorGetColorSpace(_color.CGColor)) != kCGColorSpaceModelRGB) {
return [NSString stringWithFormat:@"#FFFFFF"];
}
return [NSString stringWithFormat:@"#%02X%02X%02X", (int)((CGColorGetComponents(_color.CGColor))[0]*255.0), (int)((CGColorGetComponents(_color.CGColor))[1]*255.0), (int)((CGColorGetComponents(_color.CGColor))[2]*255.0)];
}