2010-12-15 20 views
8

En cuanto a guardar el UIColor en una Plist: He intentado de diferentes maneras pero no he podido hacerlo, quiero guardar y recuperar los valores de color en un archivo plist.Cómo cargar un UIColor de un Plist

No puedo extraer el valor de datos del color usando nslog y guardarlo en el plist.

¿Hay alguna otra manera de hacerlo?

Respuesta

7

Prefiero usar una cuerda para almacenar el color. El código de análisis que hace esto se muestra a continuación (recortadas de https://github.com/xslim/TKThemeManager/blob/master/TKThemeManager.m#L162)

+ (UIColor *)colorFromString:(NSString *)hexString {  
    NSScanner *scanner = [NSScanner scannerWithString:hexString]; 
    unsigned hex; 
    BOOL success = [scanner scanHexInt:&hex]; 

    if (!success) return nil; 
    if ([hexString length] <= 6) { 
     return UIColorFromRGB(hex); 
    } else { 
     unsigned color = (hex & 0xFFFFFF00) >> 8; 
     CGFloat alpha = 1.0 * (hex & 0xFF)/255.0; 
     return UIColorFromRGBA(color, alpha); 
    } 
} 
1

lo hice una categoría para esto:

@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 

El mismo formato que se utiliza por NSStringFromCGAffineTransform. Esto es en realidad una parte de un representante de objetos plist a mayor escala en [eppz! Kit en GitHub] [1].

+0

Sólo señalar que el rojo, verde, azul son los valores 0,0-1,0 no 0-255 modo los dividen por 255 para obtener el valor correcto - este me sorprendió por un tiempo. – amergin

+0

Esto es para almacenar en 'plist', es probable que desee" diseñar "los colores en' plist'. Para los ayudantes de conversión RGB, consulte http://stackoverflow.com/questions/13224206/how-do-i-create-an-rgb-color-with-uicolor/21297254#21297254 y http://stackoverflow.com/questions/ 437113/how-to-get-rgb-values-from-uicolor/21296829 # 21296829. – Geri

3

Para una solución rápida (pero tal vez no la más bonita):

  • añadir la propiedad de color como un número de tipo en el plist
  • Introduzca el color como RGB-hexdecimal, por ejemplo: 0xff00e3
  • Leer hacia fuera y procesarlo con una macro como a continuación

Aquí es un ejemplo de código:

// Add this code to some include, for reuse 
#define UIColorFromRGBA(rgbValue, alphaValue) ([UIColor colorWithRed:((CGFloat)((rgbValue & 0xFF0000) >> 16))/255.0 \ 
                   green:((CGFloat)((rgbValue & 0xFF00) >> 8))/255.0 \ 
                   blue:((CGFloat)(rgbValue & 0xFF))/255.0 \ 
                   alpha:alphaValue]) 

// This goes into your controller/view 
NSDictionary *myPropertiesDict = [NSDictionary dictionaryWithContentsOfFile:...]; 
UIColor *titleColor = UIColorFromRGBA([myPropertiesDict[@"titleColor"] integerValue], 1.0); 

Después de introducir el color que hexdecimal, el editor de plist lo mostrará como un número decimal. No está bien. Como desarrollador, normalmente copia los colores de un documento de diseño de todos modos, así que la necesidad de leer los valores de color no es tan grande.