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) && (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 < 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) && (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 < 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