如何从UIColor或rgb获取十六进制字符串

时间:2012-12-27 08:46:38

标签: objective-c

现在我可以将十六进制字符串转换为rgb颜色,如下所示:

// Input is without the # ie : white = FFFFFF
+ (UIColor *)colorWithHexString:(NSString *)hexString
{
    unsigned int hex;
    [[NSScanner scannerWithString:hexString] scanHexInt:&hex];
    int r = (hex >> 16) & 0xFF;
    int g = (hex >> 8) & 0xFF;
    int b = (hex) & 0xFF;

    return [UIColor colorWithRed:r / 255.0f
                        green:g / 255.0f
                        blue:b / 255.0f
                        alpha:1.0f];
}

如何将rgb转换为十六进制字符串?

6 个答案:

答案 0 :(得分:37)

使用此方法:

- (NSString *)hexStringForColor:(UIColor *)color {
      const CGFloat *components = CGColorGetComponents(color.CGColor);
      CGFloat r = components[0];
      CGFloat g = components[1];
      CGFloat b = components[2];
      NSString *hexString=[NSString stringWithFormat:@"%02X%02X%02X", (int)(r * 255), (int)(g * 255), (int)(b * 255)];
      return hexString;
}

答案 1 :(得分:6)

使用此UIColor扩展从中获取hexString。

  extension UIColor {
        func toHexString() -> String {
            var r:CGFloat = 0
            var g:CGFloat = 0
            var b:CGFloat = 0
            var a:CGFloat = 0

            getRed(&r, green: &g, blue: &b, alpha: &a)

            let rgb:Int = (Int)(r*255)<<16 | (Int)(g*255)<<8 | (Int)(b*255)<<0

            return String(format:"#%06x", rgb)
        }
    }

答案 2 :(得分:5)

这是我在Swift中使用的代码,请注意,当您向其发送使用rgba值创建的UIColor时,这似乎工作正常,但在发送预定义颜色(如 {时)会返回一些奇怪的结果{1}}

UIColor.darkGrayColor()

答案 3 :(得分:3)

Anoop答案不正确,就像您使用[UIColor blackColor]一样,它会返回绿色的十六进制字符串。
原因是系统是切割器足以节省它将设置的内存

对于黑色
分量[0] = 0(r = 0,g = 0,b = 0)和
分量[1] = 1(a = 1)。

对于白色
分量[0] = 1(r = 1,g = 1,b = 1)和
分量[1] = 1(a = 1)。

<小时/> 使用以下类别将UIColor转换为十六进制
UIColor+Utility.h

@interface UIColor (Utility)

/**
 Return representaiton in hex
 */
-(NSString*)representInHex;
@end

UIColor+Utility.m

@implementation UIColor (Utility)
-(NSString*)representInHex
{
    const CGFloat *components = CGColorGetComponents(self.CGColor);
    size_t count = CGColorGetNumberOfComponents(self.CGColor);

    if(count == 2){
        return [NSString stringWithFormat:@"#%02lX%02lX%02lX",
                lroundf(components[0] * 255.0),
                lroundf(components[0] * 255.0),
                lroundf(components[0] * 255.0)];
    }else{
        return [NSString stringWithFormat:@"#%02lX%02lX%02lX",
                lroundf(components[0] * 255.0),
                lroundf(components[1] * 255.0),
                lroundf(components[2] * 255.0)];
    }
}
@end

答案 4 :(得分:0)

Objective-c UIColor类别。这种方法可以避免类似#FFFF00000000

的情况
- (id)hexString {
    CGFloat r, g, b, a;
    [self getRed:&r green:&g blue:&b alpha:&a];
    int rgb = (int)(r * 255.0f)<<16 | (int)(g * 255.0f)<<8 | (int)(b * 255.0f)<<0;
    if (a < 1) {
        rgb = (int)(a * 255.0f)<<24 | (int)(r * 255.0f)<<16 | (int)(g * 255.0f)<<8 | (int)(b * 255.0f)<<0;
    }
    
    return [NSString stringWithFormat:@"#%06x", rgb];
}

答案 5 :(得分:-1)

对于Xamarin用户,这是我创建的扩展方法:

public static string HexColor(this UIColor color)
    {

        nfloat red, green, blue, alpha;
        color.GetRGBA(out red, out green, out blue, out alpha);
        return "#" + ((int)(alpha * 255.0)).ToString("X2") + ((int)(red * 255.0)).ToString("X2") + ((int)(green * 255.0)).ToString("X2") + ((int)(blue * 255.0)).ToString("X2");

    }