2012-01-11 14 views
6

Mam kilka żółtych przycisków utworzonych za pomocą narzędzia Inteface Builder. Wszystkie mają ten sam kolor. Obecnie deklaruję kolor w każdym Xib. Czy mogę zadeklarować to globalnie i ponownie wykorzystać we wszystkich wersjach xibs?Czy mogę ponownie użyć kolorów w programie Interface Builder?

+1

Jaką część "in Interface Builder" zrobiła każda osoba, która odpowiedziała na to pytanie, nie rozumiejąc? Dziwne. –

+1

@MarkAmery Oznacza to, że jedynym sposobem na to jest użycie _code_. – Tricertops

+0

To naprawdę głupie, że nie ma sposobu, aby to zrobić. Kto chce zmienić kolor na 100 stron jeden po drugim w IB? – Jonny

Odpowiedz

-1

Zdecydowanie!

Utwórz singleton przedmiot (można nazwać to OksanaColor, aby być cool) ...

... lub, jeśli naprawdę jesteś leniwy, tylko do odczytu UIColor właściwość, że można uzyskać dostęp z delegacja aplikacji.

-1

Możesz również dodać kategorię na UIColor, dzięki czemu można jej używać tak samo, jak podczas korzystania z UIColor. Na przykład w mojej aplikacji dodaję nowy plik o nazwie ApplicationColors, który zawiera wszystkie moje kolory aplikacji.

@interface UIColor (ApplicationColours) 

+(UIColor *)savaColor; 

@end 

Realizacja:

@implementation UIColor (ApplicationColours) 

+(UIColor *)savaColor 
{ 
    return [UIColor colorWithRed:228.0f/255.0f green:86.0f/255.0f blue:86.0f/255.0f alpha:1.0f]; 

} 

@end 

Potem go używać w moim app, mam importować ApplicationColours.h i używać tak samo jak każdy inny UIColor. tj:

label.textColor = [UIColor savaColor]; 
+1

Możesz chcieć, aby + savaColor zachowała zmienną statyczną dla tego koloru, tak aby za każdym razem nie tworzyła nowej instancji. – NSResponder

+0

Tak dobre myślenie @NSResponder nigdy o tym nie myślałem :) –

+2

Nie chcę tego robić w kodzie. Chcę ustawić wewnątrz konstruktora interfejsu. – Oksana

-2

Oto bardzo prosta implementacja nazwie kategorii kolory dla UIColor. Z tego kodu w swoim projekcie, UIColor zapamięta jakieś kolory, które chcesz zapisać, a pozwoli Ci uzyskać dostęp do własnych kolorów lub kolorów systemowych za pomocą +colorWithName:

@interface UIColor (namedColors) 

+ (UIColor *) colorWithName:(NSString *) name; 
+ (void) setColor:(UIColor *) color forName:(NSString *) name; 

@end 

static NSMutableDictionary *colorStorage; 

@implementation UIColor (namedColors) 

+ (NSMutableDictionary *) colorStorage 
{ 
    if (!colorStorage) 
    colorStorage = [[NSMutableDictionary alloc] initWithCapacity:10]; 
    return colorStorage; 
} 

+ (UIColor *) colorWithName:(NSString *) name 
{ 
    UIColor *result =[[self colorStorage] valueForKey:name]; // See if we have a color with this name in the colorStorage. 

    if (result) return result; 

    SEL selector = NSSelectorFromString(name); // look for a class method whose selector matches the given name, such as "blueColor" or "clearColor". 

    if ([self respondsToSelector:selector] && (result = [self performSelector:selector])) 
    if ([result isKindOfClass:[self class]]) 
     return result; 

    return nil; 
} 

+ (void) setColor:(UIColor *) color forName:(NSString *) name 
{ 
    [[self colorStorage] setValue:color forKey:name]; 
} 

@end 
+0

Może zbyt skomplikowane? Proste '[UIColor myRedColor]' lub '[UIColor anotherRedColor]' byłoby wystarczające i prostsze, nie? – Tricertops

3

Tak, można to zrobić.

U dołu wyskakującego selektora kolorów w programie Interface Builder znajduje się rząd kwadratów, które można wykorzystać do przechowywania kolorów do późniejszego wykorzystania. Przeciągnij kolor do niego z prostokąta, w którym bieżący kolor jest wyświetlany u góry selektora kolorów, aby go zapisać, a następnie po prostu kliknij zapisany kolor później, aby go użyć.

diagram showing how to save colors

+1

To nie pozwoli ci ponownie zastosować koloru, gdy zdecydujesz się go zmienić. Jest to jednak jedyny prymitywny sposób zapisywania kolorów w celu ręcznego ponownego użycia. – Tricertops

+0

@ iMartin Masz rację, że to jest problem, a ja o tym nie pomyślałem. W przypadku niektórych hackery nadal możesz zmienić kolor globalnie, używając tej metody. Jeśli chcesz zmienić kolor w swoim scenorysie, po prostu znajdź i zamień wszystkie wystąpienia znacznika reprezentującego ten kolor w bazowym pliku XML Storyboard (lub wszystkich XIB w twoim projekcie). To hack, ale zadziała, i nie jest to coś, co musisz zrobić często. –

7

Niemożliwe w konstruktorze Interface. Zrób to w kodzie, na przykład tworząc specjalną podklasę przycisku.

Możesz użyć systemowej palety kolorów, aby zapisać kolor, ale nadal musisz zastosować go do wszystkich przycisków za każdym razem, gdy zdecydujesz się go zmienić. Lub możesz po prostu użyć ostatnio używanych kolorów w selektorze kolorów, ale żadna z metod nie jest wystarczająca dynamicznie.

+0

Dziękuję za faktyczne udzielenie odpowiedzi na pytanie. – KPM

1

Nie wierzę, że istnieje sposób, aby to zrobić całkowicie w konstruktorze interfejsów, niestety. Możesz jednak przyjść całkiem blisko z odrobiną kodu. Najlepszym sposobem znalazłem, aby móc zmieniać kolory w całej aplikacji za jednym zamachem jest do podklasy element, który ma być koloru (UILabel, na przykład), aby ustawić kolor po inicjalizacji:

@interface HuedUILabel : UILabel 
@end 

@implementation HuedUILabel 

- (id)initWithCoder:(NSCoder *)aDecoder 
{ 
    self = [super initWithCoder:aDecoder]; 
    if (self) { 
     // Initialization code 
     self.textColor = [AppConfig primaryColor]; 
    } 
    return self; 
} 

@end 

Następnie ustaw etykietę, aby mieć klasę niestandardowego w IB:

teraz, gdy chcemy zmienić kolor wszystkich UILabels, można to zrobić zmieniając jeden kolor def i nie musisz zagracać swój kod przy pomocy kilku przydziałów wyglądu.

Powiązane problemy