【问题标题】:How do I set a custom font for the whole application?如何为整个应用程序设置自定义字体?
【发布时间】:2011-11-28 06:10:59
【问题描述】:

有什么方法可以将全局字体 [新自定义字体] 应用于 iphone Objective-c 中的整个应用程序。

我知道我们可以使用下面的方法来设置每个标签的字体

[self.titleLabel setFont:[UIFont fontWithName:@"FONOT_NAME" size:FONT_SIZE]];

但我想为整个应用程序进行更改。 如果有人知道,请帮助我。

【问题讨论】:

  • 您的意思是要更改整个应用程序的现有字体吗?

标签: iphone objective-c ios uiview custom-font


【解决方案1】:

这是你的意思吗?

@interface GlobalMethods
+(UIFont *)appFont;
@end

@implementation GlobalMethods
+(UIFont *)appFont{
    return [UIFont fontWithName:@"someFontName" size:someFontSize];
}
@end

...
[self.titleLabel setFont:[GlobalMethods appFont]];

如果您想以某种方式自动执行此操作(不在每个控件上使用 setFont),我认为这是不可能的。

【讨论】:

  • 看看下面的答案 - 可能的:)
【解决方案2】:

如果您可以将您的应用程序(或此特定功能)限制为 iOS 5,那么将会有一个新的 API 可以让您非常方便地为默认 UI 设置外观。我不能给你详细信息,因为在我写这篇文章的时候它们还在保密协议下。查看 iOS 5 测试版 SDK 以了解更多信息。

【讨论】:

    【解决方案3】:

    显然要完全更改所有 UILabel,您需要在 UILabel 上设置一个类别并更改默认字体。所以这里有一个解决方案:

    创建文件CustomFontLabel.h

    @interface UILabel(changeFont)
    - (void)awakeFromNib;
    -(id)initWithFrame:(CGRect)frame;
    @end
    

    创建文件CustomFontLabel.m

    @implementation UILabel(changeFont)
    - (void)awakeFromNib
    {
        [super awakeFromNib];
        [self setFont:[UIFont fontWithName:@"Zapfino" size:12.0]];
    }
    
    -(id)initWithFrame:(CGRect)frame
    {
        id result = [super initWithFrame:frame];
        if (result) {
            [self setFont:[UIFont fontWithName:@"Zapfino" size:12.0]];
        }
        return result;
    }
    @end
    

    现在......在任何你想要这些自定义字体标签的视图控制器中,只需在顶部包含:

    #import "CustomFontLabel.h"
    

    就是这样——祝你好运

    【讨论】:

    • 这是一个等待发生的痛苦世界。您正在替换 awakeFromNibinitWithFrame 的标准实现,现在如果 Apple 在其中添加一些重要的代码会怎样?
    • 我也有一个想法。因为你的方法太长了。我刚刚创建了一个这样的类别。在我的应用程序委托 @implementation UILabel (labelFont) - (void)awakeFromNib { [super awakeFromNib]; self.font = [UIFont fontWithName:@"Bauhaus Md BT" size:self.font.pointSize]; }
    • @zoul 是对的——最好的解决方案是拥有一个自定义类,它继承自 UILabel 并具有自定义的默认字体。然后对 IB 中的所有 UILabel 使用这个自定义类
    • @Shivam:是的。您正在使用类别覆盖 UILabel 类的标准方法。问题在于,没有明智的方法来调用您已替换的代码 - 在类别中调用 super 不会调用您已覆盖的代码。现在[UILabel awakeFromNib] 的标准实现似乎没有做任何重要的事情,所以“解决方案”现在可以工作。这可能会在任何次要更新中发生变化,您的应用程序将会中断。
    • 人们,不要使用这个!首先是经济原因:你今天的工作价值低于明天,所以今天节省时间会让你明天花更多时间不是一个明智的决定。然后是直接原因:这可以随时改变!请了解方法 swizzling 以更安全的方式进行操作。
    【解决方案4】:

    Ican 的类别解决方案可能只是为了节省时间。但是避免使用 category 来覆盖现有方法,正如苹果解释的那样: Avoid Category Method Name Clashes

    ...如果在一个类别中声明的方法的名称与原始类中的方法或同一类(甚至超类)上另一个类别中的方法相同,则行为未定义为在运行时使用哪种方法实现。 ...

    另请注意,覆盖 -(id) init; 比覆盖 -(id)initWithFrame:(CGRect)frame 更安全。单击 UIButtons 上的标签时,您不会遇到无法接收触摸事件的问题。

    【讨论】:

      【解决方案5】:

      自定义标签.h

      #import <UIKit/UIKit.h>
      
      @interface VVLabel : UILabel
      
      @end
      

      自定义标签.m

      #import "CustomLabel.h"
      #define FontDefaultName @"YourFontName"
      @implementation VVLabel
      - (instancetype)initWithCoder:(NSCoder *)aDecoder {
          self = [super initWithCoder: aDecoder];
          if (self) {
              // Initialization code
              // Static font size
              self.font = [UIFont fontWithName:FontDefaultName size:17];
      
      
              // If you want dynamic font size (Get font size from storyboard / From XIB then put below line)
              self.font = [UIFont fontWithName:FontDefaultName size:self.font.pointSize];
      
          }
          return self;
      }
      

      【讨论】:

        猜你喜欢
        • 2012-08-30
        • 2016-02-28
        • 2011-02-12
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多