読者です 読者をやめる 読者になる 読者になる

plistからUIColorを読み込む

#import <UIKit/UIKit.h>

typedef struct _RGBColor {
    float r;
    float g;
    float b;
}RGBColor;

typedef struct _RGBAColor{
    float r;
    float g;
    float b;
    float a;
}RGBAColor;


@interface UIColor (Extension)

UIColor* UIColorWithRGBFromString(NSString* str);
UIColor* UIColorWithRGBAFromString(NSString* str);

NSString* NSStringFromRGBColor(RGBColor rgbColor);
NSString* NSStringFromRGBAColor(RGBAColor rgbaColor);

RGBColor RGBColorFromString(NSString *str);
RGBAColor RGBAColorFromString(NSString *str);

@end
#import "UIColor+Extension.h"

@implementation UIColor (Extension)

NSUInteger countOfString(NSString *str, NSString *searchStr)
{
    NSUInteger count = 0;
    NSString *_str = str;

    while ([_str rangeOfString:searchStr].location != NSNotFound) {
        count++;
        _str = [_str substringFromIndex:[_str rangeOfString:searchStr].location + 1];
    }
    return count;
}


#pragma mark -- make UIColor --
UIColor* UIColorWithRGBFromString(NSString* str)
{
    RGBColor rgbColor = RGBColorFromString(str);

    return [UIColor colorWithRed:rgbColor.r green:rgbColor.g blue:rgbColor.b alpha:1.0];
}

UIColor* UIColorWithRGBAFromString(NSString* str)
{
    RGBAColor rgbaColor = RGBAColorFromString(str);

    return [UIColor colorWithRed:rgbaColor.r green:rgbaColor.g blue:rgbaColor.b alpha:rgbaColor.a];
}


#pragma mark -- convert ColorStruct to NSString --
NSString* NSStringFromRGBColor(RGBColor rgbColor)
{
    return [NSString stringWithFormat:@"{%f, %f, %f}", rgbColor.r, rgbColor.g, rgbColor.b];
}

NSString* NSStringFromRGBAColor(RGBAColor rgbaColor)
{
    return [NSString stringWithFormat:@"{%f, %f, %f, %f}", rgbaColor.r, rgbaColor.g, rgbaColor.b, rgbaColor.a];
}


#pragma mark -- convert NSString to ColorStruct --
RGBColor RGBColorFromString(NSString *str)
{
    RGBColor retval = {0, 0, 0};

    NSUInteger leftBracketCount = countOfString(str, @"{");
    NSUInteger rightBracketCount = countOfString(str, @"}");
    if( !((leftBracketCount == 1) &amp;&amp; (rightBracketCount == 1)) )
    {
        return retval;
    }

    NSRange firstLeftBracket = [str rangeOfString:@"{"];
    NSRange mostRightBracket = [str rangeOfString:@"}"options:NSBackwardsSearch];

    NSRange subStringRange = NSMakeRange(firstLeftBracket.location + 1,
                                         mostRightBracket.location - firstLeftBracket.location - 1);
    str = [str substringWithRange:subStringRange];
    NSArray *valueArray = [str componentsSeparatedByString:@","];

    if(valueArray.count &lt; 3)
    {
        return retval;
    }

    retval.r = [(NSString*)[valueArray objectAtIndex:0] floatValue];
    retval.g = [(NSString*)[valueArray objectAtIndex:1] floatValue];
    retval.b = [(NSString*)[valueArray objectAtIndex:2] floatValue];
    return retval;
}

RGBAColor RGBAColorFromString(NSString *str)
{
    RGBAColor retval = {0, 0, 0, 0};

    NSUInteger leftBracketCount = countOfString(str, @"{");
    NSUInteger rightBracketCount = countOfString(str, @"}");
    if( !((leftBracketCount == 1) &amp;&amp; (rightBracketCount == 1)) )
    {
        return retval;
    }

    NSRange firstLeftBracket = [str rangeOfString:@"{"];
    NSRange mostRightBracket = [str rangeOfString:@"}"options:NSBackwardsSearch];

    NSRange subStringRange = NSMakeRange(firstLeftBracket.location + 1,
                                         mostRightBracket.location - firstLeftBracket.location - 1);
    str = [str substringWithRange:subStringRange];
    NSArray *valueArray = [str componentsSeparatedByString:@","];

    if(valueArray.count &lt; 4)
    {
        return retval;
    }

    retval.r = [(NSString*)[valueArray objectAtIndex:0] floatValue];
    retval.g = [(NSString*)[valueArray objectAtIndex:1] floatValue];
    retval.b = [(NSString*)[valueArray objectAtIndex:2] floatValue];
    retval.a = [(NSString*)[valueArray objectAtIndex:3] floatValue];
    return retval;
}

@end

github:https://github.com/ryufloat/CocoaExtension

plistからUIColorを読み込もうと思ったときに、引っかかったので自作しました。
CGRectやCGPointと同じ形式でUIColorを読み込めます。

    NSString *rgbString = @"{0.1, 0.2, 0.4}";
    NSString *rgbaString = @"{0.1, 0.2, 0.4, 0.8}";

    UIColor *testUIColorRGB = [[UIColor alloc]init];
    UIColor *testUIColorRGBA = [[UIColor alloc]init];
    testUIColorRGB = UIColorWithRGBFromString(rgbString);
    testUIColorRGBA = UIColorWithRGBAFromString(rgbaString);

このように機能します。
plistから上記のような形式でNSStringとして読み込み、即変換できます。
RGBとRGBAの形式を用意しており、RGBのときはalphaは1.0に初期化されます。


上のコードをコビー&ペーストですぐに使えるようになっています。
gitの中では、NSStringとUIColorでクラスを分けているだけです。
自由にお使いください。


NSStringから構造体を生成するのに、CGPointFromString等のアルゴリズムを参考にしました。
詳しくはこちらの記事をどうぞ
http://ryutamaki.hatenablog.com/entry/2013/03/09/222453