2010-12-15 19 views
8

Riguardo al salvataggio di UIColor in un Plist: Ho provato diversi modi ma non sono stato in grado di farlo, voglio salvare e recuperare i valori di colore in un file plist.Come caricare un UIColor da un Plist

Non riesco a estrarre il valore dei dati del colore utilizzando nslog e salvarlo nel plist.

C'è un altro modo per farlo?

risposta

7

Preferisco usare la stringa per memorizzare il colore. Il codice di analisi che fa questo mostrate sotto (tagliato da 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

ho fatto una categoria per questo:

@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 

la stessa formattazione che viene utilizzato da NSStringFromCGAffineTransform. Questo è in realtà una parte di un più grande rappresentatore di oggetti plist in [eppz! Kit in GitHub] [1].

+0

Solo per notare che i valori, verde, blu rosso sono 0.0-1.0 non 0-255 modo da dividere per 255 per ottenere il valore corretto - questa mi ha catturato per un po '. – amergin

+0

Questo è per la memorizzazione in 'plist', probabilmente si desidera" progettare "i colori in' plist'. Per gli helper di conversione RGB, consulta http://stackoverflow.com/questions/13224206/how-do-i-create-an-rgb-color-with-uicolor/21297254#21297254 e http://stackoverflow.com/questions/ 437.113/how-to-get-rgb-valori-da-UIColor/21296829 # 21.296.829. – Geri

3

Per una soluzione rapida (ma forse non il più carina):

  • aggiungere la proprietà colore come un numero di tipo nel plist
  • Inserisci il colore come RGB-esa decimale, ad esempio: 0xff00e3
  • Leggere fuori e elaborarlo con una macro come qui di seguito

Ecco un esempio di codice:

// 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); 

Dopo aver inserito il colore come esa decimale, l'editor plist mostra come un numero decimale. Non bello. Come sviluppatore normalmente copi incollare comunque i colori da un documento di design, quindi la necessità di leggere i valori dei colori non è così grande.