【问题标题】:How can I reconstruct this Color DCDFE3 using UIColor? To make it display the right color如何使用 UIColor 重建此 Color DCDFE3?使其显示正确的颜色
【发布时间】:2013-09-15 06:15:29
【问题描述】:

我目前正在使用这个sn-p来解析十六进制颜色ref。但是我发现在解析“DCDFE3”时,模拟器和机器中的显示颜色都是错误的。我认为这可能是由 devide 过程引起的,但我不知道如何解决这个问题。

#define UIColorFromRGB(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]

宏是这样使用的:

self.quickInputBar.backgroundColor = UIColorFromRGB(0xDCDFE3);

不同的灰色,目的是让上栏和iOS7键盘颜色一致。

【问题讨论】:

  • 如何调用宏?
  • "DCDFE3" 是十六进制整数还是字符串?
  • 您的宏工作正常。要么是您的颜色值错误,要么是 iOS 将 RGB 颜色转换为输出设备颜色空间,这导致了差异。
  • 是的,我知道了。其实iOS7的键盘并不是单纯的一种灰色,它是由不同的灰色混合而成的。每个都有微小的差异,我不知道他们为什么这样做。
  • 你能解决你的问题吗?请将最有帮助的帖子标记为答案。

标签: ios objective-c cocoa-touch uicolor ios7


【解决方案1】:

将您的十六进制字符串转换为整数,并使用结果调用宏。它应该为您提供正确的颜色。

unsigned result = 0;
NSScanner *scanner = [NSScanner scannerWithString:@"#DCDFE3"];

[scanner setScanLocation:1]; // bypass '#' character
[scanner scanHexInt:&result];
UIColor* color = UIColorFromRGB(result);

使用 0x 和十六进制字符串也可以:

UIColorFromRGB(0xDCDFE3);

我最终得到的 UIColor 是 UIDeviceRGBColorSpace 0.862745 0.87451 0.890196 1

十六进制到整数的转换代码来自Objective-C parse hex string to integer

【讨论】:

  • 我认为问题更根本。这个解决方案不起作用。还是有不一样的。
  • 我在 UIColor 上得到的 rgb 值是否与 0xDCDFE3 的 rgb 值匹配。我认为你的十六进制颜色代码是错误的。
  • 我在 Photoshop 中选择了颜色。它是 0xd9dce0
【解决方案2】:

您可以使用 this one 之类的转换器将您的十六进制颜色转换为 rgb

然后使用此代码创建一个UIColor

float greenColor = ???/255;
float blueColor = ???/255;
float redColor = ???/255;

UIColor* color = [UIColor colorWithRed:redColor 
                                 green:greenColor 
                                  blue:blueColor 
                                 alpha:1];

【讨论】:

  • 我提到的链接以 255 的比例为您提供了蓝绿色和红色的每个值。 colorWithRed:green:blue:alpha 接受从 0 到 1 的参数(这就是为什么你必须将它除以 255)
  • 我了解您的工作。但是 OP 对所有 RGB 值都有一个值。一个巨大的数字。你不显示,如何处理它。所以你的回答没有帮助。当计算机完美地执行此操作时,为什么我要手动转换值?
【解决方案3】:

我为此编写了一个类别,而不是宏。它处理格式为@"#17BAFA(FF)", @"#ABC(F)", @"17BAFA", @"0xABC",…的RGB(A)值字符串

由于它使用消息发送而不是宏调用,因此在 Objective-C 的上下文中感觉更自然。

UIColor *color = [UIColor colorFromHexString:@"#DCDFE3"];一样使用它

之后你可以查看if(!color) { // must be an invalid format

@implementation UIColor (Creation)

+(UIColor *)_colorFromHex:(NSUInteger)hexInt
{
    int r,g,b,a;

    r = (hexInt >> 030) & 0xFF;
    g = (hexInt >> 020) & 0xFF;
    b = (hexInt >> 010) & 0xFF;
    a = hexInt & 0xFF;

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

+(UIColor *)colorFromHexString:(NSString *)hexString
{
    hexString = [hexString stringByTrimmingCharactersInSet:[NSCharacterSet whitespaceCharacterSet]];
    if ([hexString hasPrefix:@"#"]) 
        hexString = [hexString substringFromIndex:1];
    else if([hexString hasPrefix:@"0x"])
        hexString = [hexString substringFromIndex:2];

    int l = [hexString length];
    if ((l!=3) && (l!=4) && (l!=6) && (l!=8))
        return nil;

    if ([hexString length] > 2 && [hexString length]< 5) {        
        NSMutableString *newHexString = [[NSMutableString alloc] initWithCapacity:[hexString length]*2];
        [hexString enumerateSubstringsInRange:NSMakeRange(0, [hexString length]) 
                                      options:NSStringEnumerationByComposedCharacterSequences 
                                   usingBlock:^(NSString *substring, 
                                                NSRange substringRange, 
                                                NSRange enclosingRange, 
                                                BOOL *stop) 
        {
            [newHexString appendFormat:@"%@%@", substring, substring];
        }];
        hexString = newHexString;
    }

    if ([hexString length] == 6)
        hexString = [hexString stringByAppendingString:@"ff"];    

    NSScanner *scanner = [NSScanner scannerWithString:hexString];
    unsigned hexNum;
    if (![scanner scanHexInt:&hexNum]) 
        return nil;    
    return [self _colorFromHex:hexNum];
}

@end 

当我用 Photoshop 选择键盘背景颜色时,值是"0xD9DCE0",而不是"0xDCDFE3"

【讨论】:

    【解决方案4】:

    所有这些解决方案都很好,但这里有一个不同的问题。

    iOS 7 中的键盘是半透明的——你无法匹配它的颜色。我不记得工具栏模糊是否与键盘相同,但我建议尝试从工具栏中获取模糊图层并将其应用于您的 UIView

    试试这个,看看会发生什么:

    self.quickInputBar.backgroundColor = [UIColor clearColor];
    UIToolbar *blurToolbar = [[UIToolbar alloc] initWithFrame:self.quickInputBar.frame];
    blurToolbar.barStyle = UIBarStyleDefault;
    [self.quickInputBar.superview insertSubview:blurToolbar belowSubview:self.quickInputBar];
    

    【讨论】:

      【解决方案5】:

      键盘略显透明,搭配起来不是那么容易。

      但是,如果您在键盘抬起时将实心视图放在键盘后面,则可以保持一致。

      我使用了#DADCE3 的颜色。这与 iOS 8 上的轻型键盘相匹配。

      我所做的是制作一个背景颜色为#DADCE3 的 UIView 并将其放在键盘后面。拆分键盘时(在 iPad 上),无法将键盘后面的块与实际键盘区分开来。这将表明它是相同的颜色。

      【讨论】:

        【解决方案6】:

        我找到了这个 sn-p,您可以在其中传递您的十六进制值并返回 UIColor

        // Assumes input like "#00FF00" (#RRGGBB).
        + (UIColor *)colorFromHexString:(NSString *)hexString{
            if(hexString.length){
                unsigned rgbValue = 0;
                NSScanner *scanner = [NSScanner scannerWithString:hexString];
                [scanner setScanLocation:1]; // bypass '#' character
                [scanner scanHexInt:&rgbValue];
                return [UIColor colorWithRed:((rgbValue & 0xFF0000) >> 16)/255.0 
                                       green:((rgbValue & 0xFF00) >> 8)/255.0  
                                        blue:(rgbValue & 0xFF)/255.0 
                                       alpha:1.0];
            }
            return 0;
        }
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2013-10-22
          • 2015-11-23
          • 2019-11-10
          • 2022-01-20
          • 2015-06-07
          • 1970-01-01
          相关资源
          最近更新 更多