2013-06-27 59 views
5

我想定義一個宏統一所有的字體在我的應用程序:定義宏UIFont不起作用

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

,也比使用這個宏是這樣的:

myLabel.font = EXO_REGULAR_FONT(15); 

但是,編譯器給予我這個錯誤:

enter image description here

(有一個箭頭下15)。

任何想法解決?由於

回答

12

更改您的參數的名稱:

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

GCC manual

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

因此,當宏展開時,它把這個在你的代碼,因此編譯錯誤:

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

得到擴展,當你調用EXO_REGULAR_FONT(15),以

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

所以,你需要定義它像這樣的例子:

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

不要使用宏;他們是邪惡的(你剛剛經歷了許多原因之一)。

使用的函數:

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

將是不好的做法,以保持這個類似於macros.h並在PCH附上它的東西? – BooRanger

+0

@BooRanger一點都沒有。絕對比#define更好,更安全。 –

+1

UIFont上的類別也是處理自定義字體的好方法。類似於'+ systemFontOfSize:'我使用'+ appFontOfSize:','+ boldAppFontOfSize:','+ headingFont',...在我的應用程序中。 –