2013-06-27 19 views
5

voglio definire una macro per unificare tutti i font nella mia app:Definire macro per UIFont non funziona

#define EXO_REGULAR_FONT(size) [UIFont fontWithName:@"Exo-Regular" size:size] 

e rispetto all'utilizzo di questa macro in questo modo:

myLabel.font = EXO_REGULAR_FONT(15); 

Ma il dare compilatore me questo errore:

enter image description here

(c'è una freccia sotto i 15 anni).

Qualche idea da risolvere? Grazie

risposta

12

Cambiare il nome del parametro:

#define EXO_REGULAR_FONT(theFontSize) [UIFont fontWithName:@"Exo-Regular" size:theFontSize] 

Da GCC manual:

When the macro is expanded, each use of a parameter in its body is replaced by the tokens of the corresponding argument

Così, quando la macro si espande, si inserisce questo nel codice, e quindi l'errore di compilazione:

[UIFont fontWithName:@"Exo-Regular" 15:15] 
4
#define EXO_REGULAR_FONT(size) [UIFont fontWithName:@"Exo-Regular" size:size] 

ottiene espanso, quando si chiama EXO_REGULAR_FONT(15), a

[UIFont fontWithName:@"Exo-Regular" 15:15] 

Quindi è necessario definire in questo modo, ad esempio:

#define EXO_REGULAR_FONT(_size_) [UIFont fontWithName:@"Exo-Regular" size:_size_] 
3
#define EXO_REGULAR_FONT(s) [UIFont fontWithName:@"Exo-Regular" size:s] 
5

Non utilizzare una macro; sono cattivi (hai appena fatto esperienza di una delle tante ragioni).

utilizzare una funzione invece:

static inline UIFont *ExoRegularFont(CGFloat size) { 
    return [UIFont fontWithName:@"Exo-Regular" size:size]; 
} 
+0

sarebbe cattiva pratica di tenere questo in qualcosa di simile a macros.h e fissarlo nella vostra PCH? – BooRanger

+0

@BooRanger Niente affatto. Sicuramente molto meglio e più sicuro del '# define'. –

+1

una categoria su UIFont sarebbe anche un buon modo per gestire i caratteri personalizzati. Simile a '+ systemFontOfSize:' Uso '+ appFontOfSize:', '+ boldAppFontOfSize:', '+ headingFont', ... nelle mie app. –

Problemi correlati