如何为整个应用程序设置自定义字体?

9

有没有办法在iPhone Objective-C中将全局字体[新自定义字体]应用于整个应用程序。

我知道我们可以使用以下方法为每个标签设置字体:

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

但是我希望对整个应用进行更改。如果有人知道,请帮忙。

你的意思是你想要更改整个应用程序现有的字体吗? - Maulik
5个回答

5

显然,要同时更改所有的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"

这就是全部内容 - 祝你好运


11
这是一个充满痛苦的世界。您正在替换awakeFromNibinitWithFrame的标准实现,如果Apple在这里添加了一些重要的代码怎么办? - zoul
4
我有一个想法。因为你的方法太长了。 我刚刚在我的应用代理中创建了这样一个类别。@implementation UILabel (labelFont)
  • (void)awakeFromNib { [super awakeFromNib]; self.font = [UIFont fontWithName:@"Bauhaus Md BT" size:self.font.pointSize]; }
- Shivomkara Chaturvedi
1
@Shivam:是的。你正在使用类别覆盖UILabel类的标准方法。问题在于没有合理的方式来调用你已经替换的代码——在类别中调用super不会调用你已经覆盖的代码。现在,[UILabel awakeFromNib]的标准实现似乎并没有做任何重要的事情,所以这个“解决方案”现在可以工作。但是这可能会在任何小更新中改变,导致你的应用程序崩溃。 - zoul
除了分类替换方法的问题(分类中的super调用不会调用原始方法),我还看到另一个使用分类方法的巨大问题 - 你正在为标签设置默认字体,但是对于任何在IB中设置了不同大小的UILabel将使用IB指定的任何字体,或者设置为12点大小,而不是你在IB中请求的任何字体大小。 - Kendall Helmstetter Gelner
1
大家,不要使用这个!首先是经济原因:你今天的工作价值比明天低,所以节省今天的时间会让你明天花费更多的时间,这不是一个明智的决定。然后是直接原因:这个随时都可能改变!请学习方法交换来以更安全的方式实现。 - Fábio Oliveira
显示剩余5条评论

3
我的建议是使用带有类别的解决方案,以便快速解决问题。但要避免使用类别重写现有方法,正如苹果公司解释的那样: 避免命名冲突的类别方法

……如果在类别中声明的方法名称与原始类中的方法名称相同或与同一类别中(甚至是超类)的另一个方法名称相同,则无法确定在运行时使用哪个方法实现。……

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

1

这是你的意思吗?

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

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

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

如果你想以某种自动化的方式来处理它(而不是在每个控件上使用setFont),我不认为这是可能的。


1
请查看下面的答案 - 可能 :) - Marin Todorov

0

CustomLabel.h

#import <UIKit/UIKit.h>

@interface VVLabel : UILabel

@end

CustomLabel.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;
}

0
如果你的应用程序或者这个特定的功能可以限制在iOS 5上,那么有一个新的API即将推出,让你可以非常方便地自定义默认UI。由于我写这篇文章时仍然受到保密协议的约束,所以无法提供详细信息。请查看iOS 5 beta SDK以了解更多信息。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接