5

色をコア データに保存する必要がある場合は、単に NSKeyedArchiever を使用し、エンティティを読み込む必要がある場合は色を展開します。ただし、コア データ エンティティをシリアル化しようとすると、キー付きアーカイバーの NSData を文字列に変換する方法がわからないため、プロセスが失敗します。

JSONファイル内で送信するためにUIColorを文字列表現に変換する最良の方法は何ですか? 1 つの解決策は、r、g、b、a の値を float として格納することです。1 つの解決策は、16 進文字列として保存することです。これらはどちらも、色の復元のプロセスを複雑にしているようです

何か不足していますか?JSON 内で UIColor をシリアル化する簡単な方法はありますか?

4

5 に答える 5

5

どのようにそのことについて:

NSDictionary *colorData = [NSDictionary dictionaryWithObjectsAndKeys:[NSNumber numberWithFloat:100.f], @"Red",
                               [NSNumber numberWithFloat:24.f], @"Green",
                               [NSNumber numberWithFloat:23.f], @"Blue",
                               [NSNumber numberWithFloat:1.f], @"Alpha", nil];

NSDictionary *color = [NSDictionary dictionaryWithObject:colorData forKey:@"Color"];

結果は次のようになります。

{"Color":{"Green":24,"Alpha":1,"Blue":23,"Red":100}}

UIColor引数として取り、直接シリアル化できる NSDictionary を返すメソッドを簡単に作成できます。逆のプロセスも同じです。

于 2012-05-20T17:33:54.160 に答える
2

UIColorJSONに(一般的な「色」は言うまでもなく)配置するための定義された標準がないため、独自にロールする必要があります。

UIColor最も良い方法は、RGB色空間の色の標準の16進コードを提供し、そのような16進コードを取り込んでsを吐き出すカテゴリを設定することですUIColor。次に、その16進コードをJSONで送信します。

やり過ぎに思えるかもしれませんが、これははるかにポータブルでコンパクトなソリューションです。

UIColorhex toメソッドの例は、私のMJGFoundationUIColorカテゴリにあります。16進値に移行するための同様のものはUIColor、書くのはそれほど難しいことではありませんが、最初にRGBA色空間で取得する必要があることに注意してください。

于 2012-05-20T17:35:50.540 に答える
2

これは、色の「プライベート」フォーマットの自由度に依存します。一部の色は、RGBA を要求されてもうまく反応しません (そのため、get...メソッドが a を返すのはなぜでしょうか。BOOL常に成功するとは限りません)。そのため、この実装には色の種類と値が含まれています。

@implementation UIColor (JSON)

- (NSString *)json_stringValue
{
    CGFloat r, g, b, a, h, s, w;
    if ([self getRed:&r green:&g blue:&b alpha:&a]) 
        return [NSString stringWithFormat:@"rgba:%f,%f,%f,%f", r,g,b,a];
    else if ([self getHue:&h saturation:&s brightness:&b alpha:&a])
        return [NSString stringWithFormat:@"hsba:%f,%f,%f,%f", h,s,b,a];
    else if ([self getWhite:&w alpha:&a]) 
        return [NSString stringWithFormat:@"wa:%f,%f", w, a];

    NSLog(@"WARNING: unable to serialize color %@", self);
    return nil;
}

@end

@implementation NSString (JSON)

- (UIColor *)json_color
{
    NSArray *comps = [self componentsSeparatedByString:@":"];
    NSArray *colors = [comps[1] componentsSeparatedByString:@","];
    NSUInteger count = colors.count;
    CGFloat values[4] = {0,0,0,0};
    for (NSUInteger i = 0; i < count; i++) values[i] = [colors[i] floatValue];

    if ([comps[0] isEqualToString:@"rgba"]) 
        return [UIColor colorWithRed:values[0] green:values[1] blue:values[2] alpha:values[3]];
    else if ([comps[0] isEqualToString:@"hsba"])
        return [UIColor colorWithHue:values[0] saturation:values[1] brightness:values[2] alpha:values[3]];
    else if ([comps[0] isEqualToString:@"wa"])
        return [UIColor colorWithWhite:values[0] alpha:values[1]];

    NSLog(@"WARNING: unable to deserialize color %@", self);
    return nil;
}

@end
于 2015-03-31T06:13:14.060 に答える
1

私が見つけた解決策は、UIColor から CIColor を作成してから元に戻すことです。

文字列に変換:

CIColor(color: UIColor.blue).stringRepresentation

色に変換:

UIColor(ciColor: CIColor(string: databaseColorString))
于 2017-02-06T05:54:32.553 に答える
0

2つの答えを組み合わせると、次のようになります。

保存する:

#import "UIColor-HSVAdditions.h"
#import "JSONKit.h"

UIColor* color = textView.textColor;
            NSDictionary *colorData = [NSDictionary dictionaryWithObjectsAndKeys:[NSNumber numberWithFloat:color.hue], @"Hue",
                                       [NSNumber numberWithFloat:color.saturation], @"Saturation",
                                       [NSNumber numberWithFloat:color.brightness], @"Brightness",
                                       [NSNumber numberWithFloat:color.alpha], @"Alpha", nil];

            NSString* jsonString = [colorData JSONString];

ロードするには:

 NSDictionary* dictionary = [coreDataEntity.fontColor objectFromJSONString];

                    NSNumber* hue =[dictionary objectForKey:kHueKey];
                    NSNumber* saturation =[dictionary objectForKey:kSaturationKey];
                    NSNumber* brightness =[dictionary objectForKey:kBrightnessKey];
                    NSNumber* alpha =[dictionary objectForKey:kAlphaKey];

                    UIColor* color = [UIColor colorWithHue:hue.floatValue saturation:saturation.floatValue brightness:brightness.floatValue alpha:alpha.floatValue];

                    textView.textColor = color;
于 2012-05-21T12:14:54.130 に答える