UIColor в шестнадцатеричный (веб-цвет) - PullRequest
7 голосов
/ 31 декабря 2011

Есть ли простой способ преобразовать UIColor в шестнадцатеричное значение?
Или нам нужно получить компоненты RGB с CGColorGetComponents, а затем обработать его оттуда?

например CGColorGetComponents(color.CGColor)[0] * 256?

Ответы [ 5 ]

10 голосов
/ 21 января 2013

Мне также пришлось преобразовать UIColor в его шестнадцатеричные компоненты.

Как уже указывал lewiguez, в github есть очень хорошая категория, которая делает все это.

Но поскольку я хотел узнать, как это делается, я сделал собственную простую реализацию для цветов RGB.

+ (NSString*)colorToWeb:(UIColor*)color
{
    NSString *webColor = nil;

    // This method only works for RGB colors
    if (color &&
        CGColorGetNumberOfComponents(color.CGColor) == 4)
    {
        // Get the red, green and blue components
        const CGFloat *components = CGColorGetComponents(color.CGColor);

        // These components range from 0.0 till 1.0 and need to be converted to 0 till 255
        CGFloat red, green, blue;
        red = roundf(components[0] * 255.0);
        green = roundf(components[1] * 255.0);
        blue = roundf(components[2] * 255.0);

        // Convert with %02x (use 02 to always get two chars)
        webColor = [[NSString alloc]initWithFormat:@"%02x%02x%02x", (int)red, (int)green, (int)blue];
    }

    return webColor;
}

Все отзывы приветствуются!

7 голосов
/ 31 декабря 2011

Я бы рассмотрел использование категории UIColor Эрики Садун. Он включает в себя множество бесплатных функций, включая шестнадцатеричные представления. Его довольно просто использовать, просто добавьте его в любой заголовок класса, в котором вы его используете, или добавьте его в предварительно скомпилированный заголовок для максимальной гибкости. Если вы добавляете в предварительно скомпилированный заголовок, сделайте так, как показано ниже:

#ifdef __OBJC__
    #import <Foundation/Foundation.h>
    #import <UIKit/UIKit.h>
    #import "UIColor-Expanded.h"
#endif

Тогда вы можете использовать его так, как NSLog(@"%@", [myColor hexStringFromColor]);

Ссылка GitHub на категорию UIColor: https://github.com/erica/uicolor-utilities

АрсТехника статья об этом: http://arstechnica.com/apple/guides/2009/02/iphone-development-accessing-uicolor-components.ars

2 голосов
/ 09 сентября 2014

Кроме широко используемого решения на основе строк, вот решение на основе шестнадцатеричного (целого). Использование:

UIColor* color = lf_rgb(0x120aef);
log(@"color %.6x", color.hex_rgb);

И вы получите «цвет 120aef». Я вставлю этот код в https://github.com/superarts/LCategory,, или вы можете скопировать и вставить в свой собственный банк кодов:

#define lf_rgb(rgbValue)    [UIColor colorWithRed:((float)((rgbValue & 0xFF0000) >> 16))/255.0 green:((float)((rgbValue & 0xFF00) >> 8))/255.0 blue:((float)(rgbValue & 0xFF))/255.0 alpha:1.0]

@interface UIColor (lc_rgb)
- (NSInteger)hex_rgb;
@end

@implementation UIColor (lc_rgb)
- (NSInteger)hex_rgb
{
    CGFloat r, g, b, a;
    BOOL result = [self getRed:&r green:&g blue:&b alpha:&a];
    //  log(@"rgba: %f, %f, %f, %f", r * 255, g * 255, b * 255, a * 255);
    if ((result == NO) || (a != 1.0f))
        return -1;
    return 
        (NSInteger)(r * 255) * 256 * 256 + 
        (NSInteger)(g * 255) * 256 +
        (NSInteger)(b * 255) * 1;
}
@end
1 голос
/ 31 декабря 2011

Насколько я знаю, встроенного решения не существует.
Обратите внимание, что вы должны умножить на 255 вместо 256.

Получение шестнадцатеричного представления - это простая задача, поэтому у вас не будет проблем с созданием строки вручную.

NSLog(@"%X%X%X", redInteger, greenInteger, blueInteger);
0 голосов
/ 23 декабря 2016

Вот как я это сделал со Swift 3:

extension UIColor {
    var hex:String{
        get{
            var red:CGFloat = 0
            var blue:CGFloat = 0
            var green:CGFloat = 0
            var alpha:CGFloat = 0

            self.getRed(&red, green: &green, blue: &blue, alpha: &alpha)
            let rgb:Int = (Int)(red*255)<<16 | (Int)(green*255)<<8 | (Int)(blue*255)<<0
            return String.localizedStringWithFormat("#%06x", rgb)
        }
    }
}

Или вы можете сделать это методом. Мне просто нравится, как color.hex выглядит против color.hex().

...