2010-12-15 12 views
8

Zapisywanie UIColor w Plist: Próbowałem różnych sposobów, ale nie mogłem tego zrobić, chcę zapisać i pobrać wartości kolorów w plist pliku.Jak załadować UIColor z Plista

Nie mogę wyodrębnić wartości danych koloru za pomocą polecenia nslog i zapisać go w pliku plist.

Czy jest jakaś inna metoda?

Odpowiedz

7

Wolę używać ciągu do przechowywania koloru. Kod parsowania że ma to pokazano poniżej (wycięty z 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

zrobiłem kategorię dla tego:

@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 

tego samego formatowania, który jest używany przez NSStringFromCGAffineTransform. W rzeczywistości jest to część większego obiektu reprezentującego obiekty plist w [eppz! Kit w GitHub] [1].

+0

Wystarczy pamiętać, że czerwone, zielone, niebieskie wartości 0.0-1.0 nie 0-255 więc podzielić je przez 255, aby uzyskać prawidłową wartość - to chwycił mnie na chwilę. – amergin

+0

To jest do przechowywania w 'plist', prawdopodobnie chcesz" zaprojektować "kolory w' plist'. Pomocy do konwersji RGB można znaleźć na stronie http://stackoverflow.com/questions/13224206/how-do-i-create-an-rgb-color-with-uicolor/21297254#21297254 oraz http://stackoverflow.com/questions/ 437113/how-to-get-rgb-values-from-uicolor/21296829 # 21296829. – Geri

3

Dla szybkiego rozwiązania (ale może nie najbardziej ładna):

  • Dodaj właściwość koloru w postaci liczby typu w plist
  • Wprowadź koloru jako RGB-hexdecimal, na przykład: 0xff00e3
  • Przeczytaj go i przetwarza je w makro jak poniżej

Oto przykładowy kod:

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

Po wprowadzeniu kolor jak hexdecimal, redaktor plist pokaże ją jako liczbę dziesiętną. Niemiły. Jako programista zazwyczaj kopiujesz wklejać kolory z dokumentu projektowego, więc potrzeba odczytywania wartości kolorów nie jest tak duża.