Как мне преобразовать шестнадцатеричный цвет в строке NSString в три отдельных значения rgb в Objective C? - PullRequest
1 голос
/ 01 октября 2011

Возможно, я делаю что-то невероятно простое, невероятно сложное, но пока ничего из того, что я пробовал, похоже, не работает.

У меня есть строки NSS вроде @ "BD8F60", и я хотел бы превратить их в целые числа типаr = 189, g = 143, b = 96.

Найдены способы преобразования шестнадцатеричных значений, которые уже являются целыми числами, в целые числа rgb, но я застрял в том, как изменить строку NSString с буквами в ней в intгде буквы были преобразованы в их числовые аналоги.Заранее извиняюсь, если это невероятно просто - я все еще изучаю этот материал на невероятно базовом уровне.

Ответы [ 3 ]

12 голосов
/ 01 октября 2011

Вам необходимо проанализировать строку NSSt и интерпретировать шестнадцатеричные значения.

Вы можете сделать это несколькими способами, один из которых использует NSScanner

NSScanner* scanner = [NSScanner scannerWithString:@"BD8F60"];
int hex;
if ([scanner scanHexInt:&hex]) {
  // Parsing successful. We have a big int representing the 0xBD8F60 value
  int r = (hex >> 16) & 0xFF; // get the first byte
  int g = (hex >>  8) & 0xFF; // get the middle byte
  int b = (hex      ) & 0xFF; // get the last byte
} else {
  NSLog(@"Parsing error: no hex value found in string");
}

Существуют и другие возможности, такие как разделение строки на 3 и сканирование значений по отдельности (вместо битового сдвига и маскирования), но идея остается прежней.

Примечание: как объясняет документация scanHexInt:, это также работает, если к вашей строке добавлен префикс 0x, такой как @"0xBD8F60". Не работает автоматически со строками с префиксом, таким как @"#BD8F60". Используйте подстроку в этом случае.

4 голосов
/ 01 октября 2011

Этот метод превращает данную шестнадцатеричную строку в UIColor:

- (UIColor *)colorWithHexString:(NSString *)stringToConvert {
    NSScanner *scanner = [NSScanner scannerWithString:stringToConvert];
    unsigned hex;
    if (![scanner scanHexInt:&hex]) return nil;
    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];
}
0 голосов
/ 18 октября 2013

категория на UIColor, которая также имеет дело с альфа-значениями rrggbbaa и короткими формами как rgb или rgba.

используйте это как

UIColor *color = [UIColor colorFromHexString:@"#998997FF"]; //#RRGGBBAA

или

UIColor *color = [UIColor colorFromHexString:@"998997FF"]; //RRGGBBAA

или

UIColor *color = [UIColor colorFromHexString:@"0x998997FF"];// 0xRRGGBBAA

или

UIColor *color = [UIColor colorFromHexString:@"#999"]; // #RGB -> #RRGGBB

или

UIColor *color = [UIColor colorFromHexString:@"#9acd"]; // #RGBA -> #RRGGBBAA

@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 

используйте его по-быстрому:

  • добавить #include "UIColor+Creation.h" в заголовок моста
  • использование

    UIColor(fromHexString:"62AF3C")
    
...