2013-02-17 13 views
5

Vorrei creare alcuni nuovi UIColor s utilizzati nella mia app. Di tanto in tanto l'RGB viene leggermente modificato (l'ombra esatta del colore è in discussione)Utilizzare la categoria iOS per creare un nuovo colore

Attualmente devo creare i nuovi colori da RGB e il codice è cosparso dappertutto e ripetuto.

C'è un modo migliore in cui posso creare un nuovo colore e usarlo attraverso la mia app.

[UIColor myNewCustomRedColor] 

Qual è lo schema migliore qui - La categoria è la scelta giusta - se sì, come? Se no, qual è l'approccio raccomandato.

risposta

5

Un approccio che ho utilizzato su altri progetti è creare un file ProjectStyle.h, che ha #definiti per colori personalizzati e altre costanti relative allo stile. Devi solo importarlo.

Qualcosa di simile:

ProjectStyles.h 

#define RED_HEADER_COLOR [UIColor colorWithRed:0.8f green:0.1f blue:0.1f alpha:0.9f] 
#define RED_BACKGROUND_COLOR [UIColor colorWithRed:0.9f green:0.3f blue:0.1f alpha:1.0f] 
#define PRIMARY_FONT [UIFont fontWithName:@"HelveticaNeue-Bold" size:12.0f] 

Si potrebbe anche avere un file .m corrispondente, se si voleva creare istanze costanti di alcuni oggetti UIColor o UIFont, qualcosa di simile

ProjectStyles.m 

+ (UIColor *) redHeaderColor 
{ return [UIColor colorWithRed:0.8f green:0.1f blue:0.1f alpha:0.9f]; } 

+ (UIColor *) redBackgroundColor 
{ return [UIColor colorWithRed:0.9f green:0.3f blue:0.1f alpha:1.0f]; } 

+ (UIFont *) primaryFont 
{ 
    static UIFont *font = nil; 
    if (font == nil) 
     font = [UIFont fontWithName:@"HelveticaNeue-Bold" size:12.0f]; 
    return font; 
} 

E poi, naturalmente, esporre quelli nell'intestazione

L'altra cosa che mi piace di un tipo di approccio ProjectStyle è che dopo un po 'vorrai più cose personalizzate di jus t colori: caratteri personalizzati, linee personalizzate e ombre. Avere una classe Style o un'intestazione per posizionare tutte queste cose ti dà un posto dove cercare quali elementi personalizzati sono già definiti per tutti i tipi di cose, e un ovvio #import per i successivi coder che ti riconducono al tuo pozzo centralizzato di informazioni personalizzate .

Se si inseriscono solo gli elementi personalizzati nelle categorie, si finisce con la personalizzazione distribuita su più categorie e anche la possibilità (principalmente remota) di collisioni di nomi di categorie con altre librerie di terze parti.

+1

La sessione 216 del WWDC 2012 presenta un approccio molto simile a questo, se qualcuno è interessato. – MaxGabriel

+0

Quando si utilizza un modello simile al foglio di stile sembra appropriato, vorrei sempre astenermi dall'usare le direttive del preprocessore per tale compito - le definizioni non sono sicure dal punto di vista del tipo e quindi brutte. Perché non utilizzare una fabbrica di attributi di aspetto adeguato (come il colore). Qualcosa come '[MyAppearance color: @" ultraBlue "]' – Till

+3

#define è sicuro, perché finiscono per essere codice reale controllato dall'analizzatore statico e dal debugger allo stesso modo di qualsiasi altro codice (quindi da qualche parte se usa un #define che si traduce in un UIColor, ma ha bisogno di un CGColor riceverai un avvertimento immediato). L'editor completa automaticamente il codice #define, quindi MY_COLOR.CGColor completa automaticamente.Inoltre, #finefine completamento automatico degli elementi - nel tuo esempio dovresti ancora digitare @ "ultraBlue" che lascia spazio per errori. Usando i metodi #define o factory, gli stili dovrebbero completarsi automaticamente per eliminare l'errore. –

9

La categoria è una buona scelta per qualcosa di simile. Di solito faccio solo una nuova coppia di file .h/.m, MyCategories.h/MyCategories.m, che contiene categorie di uso comune che si desidera ovunque.

MyCategories.h:

@interface UIColor (MyCategory) 

+ (UIColor *)customRedColor; 

@end 

MyCategories.m

@implementation UIColor (MyCategory) 

+ (UIColor *)customRedColor { 
    return [UIColor redColor]; 
} 

@end 

è possibile importare il file .h ovunque ne abbiate bisogno, o si può attaccare l'importazione nel vostro MyApp-prefisso. file pch.

+0

Vorrei solo aggiungere che è una buona idea denominare i file di categoria come + CategoryName - Per esempio UIColor + CustomColors, lo trovo molto utile per l'organizzazione dei progetti. –

Problemi correlati