将NSString转换为UIColor

时间:2013-06-15 07:39:51

标签: objective-c nsstring uicolor

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

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

5 个答案:

答案 0 :(得分:9)

我写了一个自定义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

答案 1 :(得分:4)

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

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

答案 2 :(得分:1)

根据@ trojanfoe的优秀答案,我制作了一个基于类别的解决方案,我用它来动态配置来自Info.plist文件的UIViewControllers(当你有许多应用程序共享一个公共代码库时会有帮助):

的UIColor + STRING.H:

#import <UIKit/UIKit.h>

@interface UIColor (String)

+(UIColor*) colorFromString:(NSString*) string;

@end

的UIColor + 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];

(这假设您编辑了Info.plist并添加了一个带有子句“Colors”的Dict“Theme”,带有一个子句“NavigationBar”,带有NSString“Title”,其值为例如“1 0 0 1”(红色))

答案 3 :(得分:1)

你可以简单地使用这种格式@“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];

答案 4 :(得分:0)

[查找下面的编辑]

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

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

这样,当您想要“转换”颜色字符串时,您会:

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

myConvertedColor将是一个UIColorBlack。

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


<强> ---&GT;&gt;编辑&LT;&LT; ----

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

  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 0 1 MyColorNULL :( null)

正如您所看到的,MyColorNULL将证明您不应该如何进行搜索,而另一个则证明我的代码可以正常工作。

如果有帮助,请将我的回答标记为正确。如果它不让我们继续努力。