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

Objective c 如何从UIColor或rgb获取十六进制字符串,objective-c,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) &

现在我可以将十六进制字符串转换为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];
}
bu如何将rgb转换为十六进制字符串

使用此方法:

- (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;
}

这是我在Swift中使用的代码,请注意,当发送使用rgba值创建的UIColor时,这似乎工作正常,但在发送预定义颜色(如
UIColor.darkGrayColor()

func hexFromUIColor(color: UIColor) -> String 
{
let hexString = String(format: "%02X%02X%02X", 
Int(CGColorGetComponents(color.CGColor)[0] * 255.0),
Int(CGColorGetComponents(color.CGColor)[1] *255.0),
Int(CGColorGetComponents(color.CGColor)[2] * 255.0))
return hexString
}

使用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)
        }
    }
扩展UIColor{ func toHexString()->String{ 变量r:CGFloat=0 变量g:CGFloat=0 变量b:CGFloat=0 变量a:CGFloat=0 红色(&r,绿色:&g,蓝色:&b,阿尔法:&a)
让rgb:Int=(Int)(r*255)一个操作答案是不正确的,因为如果您尝试使用
[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


对于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");

    }

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

-(id)十六进制字符串{
cgr,g,b,a;
[自选红色:&r绿色:&g蓝色:&b字母:&a];

整数rgb=(整数)(r*255.0f)看看这个,得到了一个很好的答案+1,但是
CGFloat*组件
应该是
const CGFloat*组件
,演员阵容是不需要的。@H2CO3:好的。这段代码我三年前学可可时用过。无论如何,谢谢
碳酸
:p。我一直讨厌化学,但现在我开始喜欢……你得到了一点错误的co因为int类型转换,所以会出现lor。使用lrundf()相反。这将产生一个坏的十六进制,带有
UIColor.blackColor
UIColor.whiteColor
,因为没有第三个组件。当它有黑色时,它会给我绿色的十六进制代码。下一个答案很好。你得到的奇怪结果是因为系统定义的颜色不在RGB颜色空间中,但我n灰度颜色空间。为了防止崩溃或错误行为,您应该检查颜色空间是否匹配(CGColorGetColorSpace()),或者至少检查颜色空间的组件计数是否匹配(CGColorGetNumberOfComponents())。请围绕代码添加一些解释,以便人们更好地理解它。您需要了解一些二进制操作的基础知识:-他得到红色、绿色、蓝色、alpha的值在0.0和1.0之间,他乘以255(使值在0和255.0之间)。然后是“您是对的(+1),Anoop只处理基于RGBA的图像,而您也在处理单色图像。但实际上还有更多的可能性: