Сохраните и получите UIColor из файла .plist - PullRequest
10 голосов
/ 30 августа 2011

Я искал это некоторое время безуспешно.Мой вопрос: есть ли простой способ хранить и получать UIColors, такие как [UIColor blackColor] или [UIColor colorWithRed:0.38 green:0.757 blue:1 alpha:1]; в файле .plist в каталоге моего приложения?

Ответы [ 3 ]

7 голосов
/ 30 августа 2011

согласно этому обсуждению у вас есть два варианта:

  1. Сохраните его как NSData в поле данных файла .plist
  2. Хранить как строковое представление UIColor

NSData option

NSData *theData = [NSKeyedArchiver archivedDataWithRootObject:[UIColor greenColor]];

NSString опция

NSString *color = @"greenColor";
[UIColor performSelector:NSSelectorFromString(color)]

подробнее здесь: http://www.iphonedevsdk.com/forum/iphone-sdk-development/27335-setting-uicolor-plist.html

4 голосов
/ 27 августа 2013

Если вы хотите, чтобы это читалось человеком, Я сделал категорию для этого:

@implementation UIColor (EPPZRepresenter)


NSString *NSStringFromUIColor(UIColor *color)
{
    const CGFloat *components = CGColorGetComponents(color.CGColor);
    return [NSString stringWithFormat:@"[%f, %f, %f, %f]",
            components[0],
            components[1],
            components[2],
            components[3]];
}

UIColor *UIColorFromNSString(NSString *string)
{
    NSString *componentsString = [[string stringByReplacingOccurrencesOfString:@"[" withString:@""] stringByReplacingOccurrencesOfString:@"]" withString:@""];
    NSArray *components = [componentsString componentsSeparatedByString:@", "];
    return [UIColor colorWithRed:[(NSString*)components[0] floatValue]
                           green:[(NSString*)components[1] floatValue]
                            blue:[(NSString*)components[2] floatValue]
                           alpha:[(NSString*)components[3] floatValue]];
}


@end

То же форматирование, которое используется NSStringFromCGAffineTransform. На самом деле это часть более масштабного представления объекта plist в [eppz! Kit на GitHub] [1].

1 голос
/ 29 июля 2018

Лучший и читаемый способ в Objective-c - сохранить его в виде шестнадцатеричной строки, например: "# 1A93A8", а затем получить его методом extern;

в файле .h:

extern UIColor *colorFromHEX(NSString *hex);
extern NSString *HEXFromColor(UIColor *color);

в .m файле:

UIColor *colorFromHEX(NSString *hex){
    NSString *stringColor = hex;
    int red, green, blue;
    sscanf([stringColor UTF8String], "#%02X%02X%02X", &red, &green, &blue);

    UIColor *color = [UIColor colorWithRed:red/255.0 green:green/255.0 blue:blue/255.0 alpha:1];
    return color;
}


NSString *HEXFromColor(UIColor *color){
    const CGFloat *components = CGColorGetComponents(color.CGColor);
    size_t count = CGColorGetNumberOfComponents(color.CGColor);

    if(count == 2){
        return [NSString stringWithFormat:@"#%02lX%02lX%02lX",
                lroundf(components[0] * 255.0),
                lroundf(components[0] * 255.0),
                lroundf(components[0] * 255.0)];
    }else{
        return [NSString stringWithFormat:@"#%02lX%02lX%02lX",
                lroundf(components[0] * 255.0),
                lroundf(components[1] * 255.0),
                lroundf(components[2] * 255.0)];
    }
}

в любом месте

NSDictionary *Config = [[NSDictionary alloc] initWithContentsOfFile:[NSBundle.mainBundle pathForResource:@"Config" ofType:@"plist"]];

UIColor *color = colorFromHEX( Config[@"color"] );
NSString *strColor = HEXFromColor( UIColor.blackColor );
...