我可能会做一些极其复杂的简单事情,但到目前为止我没有尝试过的任何东西似乎都有效。
我有像@“BD8F60”这样的NSStrings,我想把它们变成像:r = 189,g = 143,b = 96。
已经找到了将已经整数的十六进制值转换为rgb整数的方法,但我仍然坚持如何将带有字母的NSString更改为一个int,其中字母已经转换为数字对应的字符串。如果这是非常基本的话,请提前道歉 - 我仍然在非常基本的水平上学习这些东西。
答案 0 :(得分:12)
您需要解析NSString并解释十六进制值。
您可以通过多种方式执行此操作,一种是使用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"
之类的字符串的字符串。在这种情况下使用子字符串。
答案 1 :(得分:4)
此方法将给定的十六进制字符串转换为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];
}
答案 2 :(得分:0)
UIColor上的一个类别,它也处理alpha值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
在swift中使用它:
#include "UIColor+Creation.h"
添加到“桥接标题”使用
UIColor(fromHexString:"62AF3C")