2012-01-11 19 views
6

Ho diversi pulsanti gialli creati utilizzando Inteface Builder. Tutti hanno lo stesso colore. Attualmente dichiaro il colore in ogni xib. Posso dichiararlo globalmente e riutilizzarlo su tutti gli xibs?Posso riutilizzare i colori in Interface Builder?

+1

Quale parte di "in Interface Builder" ha fatto in modo che ogni singola persona che ha risposto a questa domanda non capisca? Strano. –

+1

@MarkAmery Ciò significa che l'unico modo per farlo è utilizzare _code_. – Tricertops

+0

È davvero stupido che non ci sia modo di farlo. Chi vuole regolare un colore su 100 pagine uno per uno in IB? – Jonny

risposta

-1

Più decisamente!

Creare un oggetto Singleton (si può chiamare OksanaColor, per essere cool) ...

... o, se siete veramente pigri, di sola lettura UIColor proprietà che è possibile accedere dal proprio delegato dell'app.

-1

È inoltre possibile aggiungere una categoria su UIColor, in modo da poterlo utilizzare come quando si utilizza UIColor. Ad esempio nella mia app aggiungo un nuovo file chiamato ApplicationColors che contiene tutti i colori della mia app.

@interface UIColor (ApplicationColours) 

+(UIColor *)savaColor; 

@end 

Implementazione:

@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 

Poi per usarlo nella mia app, ho importare l'ApplicationColours.h e utilizzare la stessa di qualsiasi altro UIColor. cioè:

label.textColor = [UIColor savaColor]; 
+1

Si potrebbe voler rendere + savaColor mantenere una variabile statica per quel colore, in modo che non crei una nuova istanza ogni volta. – NSResponder

+0

Sì, buon pensiero @NSResponder non ci ha mai pensato :) –

+2

Non voglio farlo in codice. Voglio impostare il generatore di interfacce interno. – Oksana

-2

Ecco una semplice implementazione di una categoria di colori chiamato per UIColor. Con questo codice nel progetto, UIColor ricorderanno tutti i colori che si desidera salvare, e vi permetterà di accedere al vostro colori o colori di sistema proprio utilizzando +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

Forse troppo complicato? Semplice '[UIColor myRedColor]' o '[UIColor anotherRedColor]' sarebbe sufficiente e più semplice, no? – Tricertops

3

Sì, si può fare questo.

Nella parte inferiore del popup del selettore colori in Interface Builder, è disponibile una riga di quadrati che è possibile utilizzare per memorizzare i colori per un uso successivo. Trascina un colore in esso dal rettangolo in cui il colore corrente viene visualizzato nella parte superiore del selettore di colori per memorizzarlo, quindi fai clic su un colore memorizzato in seguito per utilizzarlo.

diagram showing how to save colors

+1

Questo non ti permetterà di riapplicare i colori quando decidi di cambiarli. Ma questo è l'unico modo primitivo per salvare i colori per il riutilizzo manuale. – Tricertops

+0

@ iMartin Hai ragione che questa è una preoccupazione, e non l'avevo presa in considerazione. Con alcuni hackery, puoi comunque scambiare un colore globalmente usando questo metodo. Se vuoi cambiare un colore attraverso lo storyboard, fai una ricerca e sostituisci tutte le occorrenze del tag che rappresentano quel colore nell'XML sottostante dello Storyboard (o di tutti gli XIB del tuo progetto). È un trucco, ma funzionerà, e non è qualcosa che dovrai fare spesso. –

7

Non possibile in Interface Builder. Inseriscilo nel codice, ad esempio creando una sottoclasse speciale del pulsante.

È possibile utilizzare la tavolozza dei colori di sistema per salvare il colore, ma è comunque necessario applicarlo a tutti i pulsanti ogni volta che si decide di modificarlo. Oppure puoi semplicemente usare Colori usati di recente nel selettore di colori, ma in entrambi i casi non c'è abbastanza dinamica.

+0

Grazie per aver effettivamente risposto alla domanda. – KPM

1

Non credo che ci sia un modo per farlo interamente nel generatore di interfacce, sfortunatamente. Tuttavia, puoi venire abbastanza vicino con un po 'di codice. Il modo migliore che ho trovato per essere in grado di cambiare i colori in tutta l'applicazione in una sola volta è quello di sottoclasse l'elemento che si desidera colore (UILabel, per esempio) per impostare il colore all'inizializzazione:

@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 

Poi , impostare l'etichetta di avere una classe personalizzata in IB:

Ora, quando si desidera cambiare il colore di tutte le UILabels, è possibile farlo modificando il vostro uno def colore e non si devi ingombrare il tuo codice con un sacco di incarichi di comparsa.

Problemi correlati