【问题标题】:Define macro for UIFont doesn't work为 UIFont 定义宏不起作用
【发布时间】:2013-06-27 09:26:57
【问题描述】:

我想定义一个宏来统一我的应用程序中的所有字体:

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

而不是像这样使用这个宏:

myLabel.font = EXO_REGULAR_FONT(15);

但是编译器给了我这个错误:

(15下有个箭头)。

有什么想法可以解决吗?谢谢

【问题讨论】:

    标签: ios objective-c


    【解决方案1】:

    更改参数名称:

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

    来自GCC manual:

    当宏展开时,其主体中参数的每次使用都会被相应参数的标记替换

    所以当你的宏展开时,它会在你的代码中插入这个,因此会出现编译错误:

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

    【讨论】:

    • swift-4 有什么可能的解决方案?
    • @Anita 请参阅下面 Nikolai 的回答及其 cmets。在 Swift 中执行此操作的一个好方法是将其添加为 UIFont 的扩展。
    【解决方案2】:
    #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】:

      不要使用宏;他们是邪恶的(你只是经历了众多原因之一)。

      改用函数:

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

      【讨论】:

      • 将其保存在类似于 macros.h 的内容中并将其附加到您的 pch 中会是不好的做法吗?
      • @BooRanger 一点也不。绝对比#define 更好、更安全。
      • UIFont 上的类别也是处理自定义字体的好方法。类似于+systemFontOfSize:,我在我的应用程序中使用+appFontOfSize:、+boldAppFontOfSize:、+headingFont、...。
      • @MatthiasBauch 您应该将此评论添加为新答案。
      【解决方案4】:
      #define EXO_REGULAR_FONT(s) [UIFont fontWithName:@"Exo-Regular" size:s]
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2012-06-07
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多