UIColor到十六进制(网页颜色)

时间:2011-12-31 17:13:02

标签: ios uikit uicolor

有一种简单的方法可以将UIColor转换为十六进制值吗? 或者我们是否必须使用CGColorGetComponents获取RGB组件,然后从那里开始工作?

例如CGColorGetComponents(color.CGColor)[0] * 256

5 个答案:

答案 0 :(得分:10)

我还必须将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;
}

欢迎所有反馈!

答案 1 :(得分:7)

我会考虑使用Erica Sadun的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

ArsTechnica关于它的文章:http://arstechnica.com/apple/guides/2009/02/iphone-development-accessing-uicolor-components.ars

答案 2 :(得分:2)

除了广泛使用的基于字符串的解决方案之外,这里还有基于十六进制(整数)的解决方案。用法:

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

答案 3 :(得分:1)

据我所知,没有任何内置的解决方案 但请注意,您应该乘以255而不是256

获取十六进制表示是一项简单的任务,因此手动构建字符串不会有太多麻烦。

NSLog(@"%X%X%X", redInteger, greenInteger, blueInteger);

答案 4 :(得分:0)

这就是我用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()的对比。