Convert NSString to UIColor



我有一个充满NSString的数组,我需要使用NSString来改变属性文本的颜色。我把原始的NSString分离成一个数组包含单个带有颜色的NSString但是我卡在这里了。数组中的字符串是[UIColor orangecolor]。我已经试过了,但是它返回null。

 SEL blackSel = NSSelectorFromString(@"blackColor");
 UIColor* tColor = nil;
if ([UIColor respondsToSelector: blackSel])
  tColor  = [UIColor performSelector:blackSel];

我编写了一个自定义NSValueTransformer,允许我将NSColor转换为NSString(并返回)以存储为NSUserDefaults,因为我不喜欢使用字节数组存储的颜色,这是默认行为。如果您在IB中设置自定义转换器,它也可以跨KVO工作。当然,您也可以调用代码中的静态方法来执行转换。

UIColor:

重做这个应该不会有很多工作

StringColourTransformer.h:

#import <Cocoa/Cocoa.h>
@interface StringColourTransformer : NSValueTransformer
+ (NSString *)toString:(NSColor *)value;
+ (NSColor *)fromString:(NSString *)value;
@end

StringColourTransformer.m:

#import "StringColourTransformer.h"
@implementation StringColourTransformer
+ (NSString *)toString:(NSColor *)value
{
    StringColourTransformer *transformer = [[StringColourTransformer alloc] init];
    NSString *str = [transformer reverseTransformedValue:value];
    return str;
}
+ (NSColor *)fromString:(NSString *)value
{
    StringColourTransformer *transformer = [[StringColourTransformer alloc] init];
    NSColor *color = (NSColor *)[transformer transformedValue:value];
    return color;
}
+ (Class)transformedValueClass
{
    return [NSString class];
}
+ (BOOL)allowReverseTransformation
{
    return YES;
}
- (id)transformedValue:(id)value
{
    CGFloat r = 0.0, g = 0.0, b = 0.0, a = 1.0;
    // Only NSString classes are reverse-transformed
    if ([value isKindOfClass:[NSString class]])
    {
        NSString *stringValue = (NSString *)value;
        sscanf([stringValue UTF8String],
#ifdef __x86_64
               "%lf %lf %lf %lf",
#else
               "%f %f %f %f",
#endif
               &r, &g, &b, &a);
    }
    return [NSColor colorWithCalibratedRed:r green:g blue:b alpha:a];
}
- (id)reverseTransformedValue:(id)value
{
    CGFloat r = 0.0, g = 0.0, b = 0.0, a = 1.0;
    // Only NSColor classes are transformed
    if ([value isKindOfClass:[NSColor class]])
    {
        NSColor *colourValue = (NSColor *)value;
        NSColor *converted = [colourValue colorUsingColorSpaceName:@"NSCalibratedRGBColorSpace"];
        [converted getRed:&r green:&g blue:&b alpha:&a];
    }
    return [NSString stringWithFormat:@"%.3f %.3f %.3f %.3f", r, g, b, a];
}
@end

使用此方法,将colorname转换为对象UIColor

-(UIColor *)giveColorfromStringColor:(NSString *)colorname
{
    SEL labelColor = NSSelectorFromString(colorname);
    UIColor *color = [UIColor performSelector:labelColor];
    return color;
}

你可以简单地为你的字符串使用这种格式@"1 0.96 0.75 1",其中的值是红色,绿色,蓝色和alpha。然后通过使用CIColor将它们转换为UIColor !

下面是一个例子:

      NSString *spinnerColorStr = @"1 0.96 0.75 1";
      CIColor *spinnerCi = [CIColor colorWithString:spinnerColorStr];
      UIColor *spinnerColor = [UIColor colorWithRed:spinnerCi.red green:spinnerCi.green blue:spinnerCi.blue alpha:spinnerCi.alpha];

基于@trojanfoe的优秀答案,我做了一个基于类别的解决方案,我用它来动态配置UIViewControllers从他们的信息。Plist文件(当你有许多应用程序共享一个共同的代码库时很有用):

用户界面颜色+ String.h:

#import <UIKit/UIKit.h>
@interface UIColor (String)
+(UIColor*) colorFromString:(NSString*) string;
@end

用户界面颜色+ String.m:

#import "UIColor+String.h"
@implementation UIColor (String)
/**
 c.f. http://stackoverflow.com/a/17121747/153422
 */
+(UIColor *)colorFromString:(NSString *)stringValue
{
    CGFloat r = 0.0, g = 0.0, b = 0.0, a = 1.0;
    sscanf([stringValue UTF8String],
#ifdef __x86_64
           "%lf %lf %lf %lf",
#else
           "%f %f %f %f",
#endif
           &r, &g, &b, &a);
    return [UIColor colorWithRed:r green:g blue:b alpha:a];
}
@end

使用例子:

NSString* colourString = [[NSBundle mainBundle].infoDictionary valueForKeyPath:@"Theme.Colours.NavigationBar.Title"];
    lTitle.textColor = [UIColor colorFromString:colourString];

(这假设你编辑了你的信息。并添加了一个字典"Theme",主题为"colors",主题为"NavigationBar",标题为NSString,值为:"1 0 0 1"(红色))

(下面寻找编辑)

我将使用查找表。在这种情况下,一个字典将保存可能的值作为键和值作为UIColor对象。例如:

NSDictionary *colorTable = @{
    @"blackColor" : [UIColor blackColor],
    @"greenColor" : [UIColor greenColor],
    @"redColor" : [UIColor redColor]
};

这样当你想"转换"一个颜色字符串时,你可以:

UIColor *myConvertedColor = [colorTable objectWithKey:@"blackColor"];

myConvertedColor将是UIColorBlack。

希望这对你有帮助!好运!


,>> EDIT<& lt;——

好的,这里是经过测试的代码。把它放在干净的地方,这样你就不会受到其他可能正在运行的东西的干扰。注意,我假设iOS…否则更改UIColor为NSColor.

  NSDictionary *colorTable = @{
                                 @"blackColor" : [UIColor blackColor],
                                 @"greenColor" : [UIColor greenColor],
                                 @"redColor" : [UIColor redColor]
                                 };

    UIColor *myConvertedColorNull = [colorTable objectForKey:@"whiteColor"]; //NULL
    UIColor *myConvertedColor = [colorTable objectForKey:@"blackColor"]; //NOT NULL
    NSLog(@"MyColor: %@", [myConvertedColor description]);
    NSLog(@"MyColorNULL: %@", [myConvertedColorNull description]);

产生如下输出:

MyColor: UIDeviceWhiteColorSpace 0MyColorNULL:(空)

如您所见,MyColorNULL是为了证明您不应该进行搜索,而另一个则证明我的代码可以工作。

如果有帮助,请把我的答案标记为正确。如果不行,我们继续解决。

最新更新