将默认字体更改为自定义字体在整个应用中

5

我想在iOS应用程序中使用自定义字体,目前我正在使用iOS默认字体。是否有可能实现同样的效果?

我应该如何包含自定义字体以便使用它?

6个回答

15

创建一个分类:

#import "UILabel+Helper.h"

@implementation UILabel (Helper)
- (void)setSubstituteFontName:(NSString *)name UI_APPEARANCE_SELECTOR {
     self.font = [UIFont fontWithName:name size:self.font.pointSize]; } 
@end

然后在AppDelegate.m中:

[[UILabel appearance] setSubstituteFontName:@"SourceSansPro-Regular"];

这将改变整个应用程序中的字体,甚至包括UIButtonUILabelUITableViewCellUICollectionViewCellUIViewUIContainerView等任何位置,而不会更改字体大小。

这是一种内存高效的方法,而不是枚举您的UIViewController中的所有视图。


1
这太棒了,迄今为止是最好的方法。 - Slee
1
最佳实现。谢谢你的代码,伙计。干杯! - Felipe
这段代码对我有效。但我遇到了另一个问题。我想在不同的控制器中更改某些UILabel的字体系列(例如:标题)。我正在使用此代码self.reg3.font = [UIFont fontWithName:@"diff_font_name" size=30]。我只是调试代码,它正确地设置了。但是之后它会更改为App delegate字体系列名称。在调试结束时执行以下代码(在将不同的font_name设置为UILabel之后)[[UILabel appearance] setSubstituteFontName:@"SourceSansPro-Regular"]。 - Silambarasan
@Xeieshan 我已经通过代码显式更改了标签的字体,但它仍然使用AppDelegate中为整个应用程序使用的字体。 - Sheraz
1
@Xeieshan,它起作用了。我使用了“setSubstituteFontName”方法来为特定的标签提供不同的字体。谢谢 :) - Sheraz
显示剩余2条评论

11
  1. 将字体文件复制到资源中

  2. 在Info.plist文件中添加一个名为UIAppFonts(“应用提供的字体”)的键。

  3. 将此键设置为数组

  4. 对于您拥有的每种字体,将其完整文件名(包括扩展名)作为项输入到UIAppFonts数组中

  5. 保存Info.plist

  6. 现在,在您的应用程序中,您只需调用以下方法即可获取用于UILabelUITextView等的自定义字体:

[UIFont fontWithName:@"CustomFontName" size:15];

检查资源中有哪些可用字体:

func allFonts(){
   for family in UIFont.familyNames(){
       println(family)
       for name in UIFont.fontNamesForFamilyName(family.description)
       {
           println("  \(name)")
       }
   }
}

UILabel中更改整个应用程序的字体:

AppDelegate.m中添加以下代码:

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
{
     ...
     [[UILabel appearance] setFont:[UIFont fontWithName:@"YourFontName" size:17]];
     ...
}

如何使一个UIViewController中的字体与视图设计中设置的字号相同:

- (void)viewDidLoad
{
    [super viewDidLoad];
    [self setFontFamily:@"YourFontName" forView:self.view andSubViews:YES];
}

-(void)setFontFamily:(NSString*)fontFamily forView:(UIView*)view andSubViews:(BOOL)isSubViews
{
    if ([view isKindOfClass:[UILabel class]])
    {
        UILabel *lbl = (UILabel *)view;
        [lbl setFont:[UIFont fontWithName:fontFamily size:[[lbl font] pointSize]]];
    }

    if (isSubViews)
    {
        for (UIView *sview in view.subviews)
        {
            [self setFontFamily:fontFamily forView:sview andSubViews:YES];
        }
    }    
}

最好的来自所有......谢谢Ashish。 - Sneha
@AshishKakkad 有没有一种方法可以通过本地化来更改字体,比如英语使用Poppins字体,阿拉伯语使用Calibari字体?我想在AppDelegate中全局更改应用程序的字体,而不是在特定的UIViewController上更改。 - Neeraj Joshi
@Nij 在设置字体之前,您必须检查当前选择的语言。 - Ashish Kakkad

1

1- 将.ttf字体文件拖放到您的项目中

2- 确认该字体已在项目中。

通过选择字体并在实用程序区域验证“目标成员资格”来进行确认。

enter image description here

3- 在plist文件中添加信息 Plist文件图像

4- 在代理中添加以下代码

[[UILabel appearance] setFont:[UIFont fontWithName:@"YourFontName" size:11.0]];

[[UITextField appearance] setFont:[UIFont fontWithName:@"YourFontName" size:11.0]];

[[UITextView appearance] setFont:[UIFont fontWithName:@"YourFontName" size:11.0]];

我希望这能有所帮助。

这个解决方案看起来不错,但是它还没有完成。我的意思是,代理类太大了。这段代码在哪里?我正在使用Swift4,我不知道在哪里可以编写它,因为我有很多编译问题。你能写下确切的代码吗?提前感谢。 - Antonio Martin

1

好的,从其他答案中你现在已经非常熟悉如何将自定义字体(而不是iOS默认字体)添加到应用程序中。

那么现在呢?还有一件事没有解决,我不确定你是否想在整个应用程序中使用相同大小的自定义字体。如果是这样的话,

我使用以下方式在我的应用程序中使用自定义字体。

如果您的应用程序只有一个自定义字体,则可以像这样在整个应用程序中使用它。

#define appFontBold(x) [UIFont fontWithName:@"CustomFont-Bold" size:x]
#define appFontLight(x) [UIFont fontWithName:@"CustonFont-Light" size:x]
#define appFontRegular(x) [UIFont fontWithName:@"CustonFont-Regular" size:x]

我已经全局添加了这些宏(因此可以从任何地方访问)
您可以像这样使用它:yourLabel.font = appFontRegular(12);yourTextField.font = appFontBold(14);,这有助于您在以下情况下使用:
  1. 每当您需要更改自定义字体时,只需更改宏中的字体名称。
  2. 您的代码将变得干净,无需到处编写[UIFont fontWithName: size:]
如果您的应用程序将具有多个自定义字体,则可以像这样为整个应用程序使用它。 然后您还可以像这样定义不同的宏:
然后上面的宏将是相同的(因为这是应用程序中最常用的字体),对于其他字体:
#define appFontBoldOtherFont(x) [UIFont fontWithName:@"CustomOtherFont-Bold" size:x]
#define appFontLightOtherFont(x) [UIFont fontWithName:@"CustonOtherFont-Light" size:x]
#define appFontRegularOtherFont(x) [UIFont fontWithName:@"CustonOtherFont-Regular" size:x]

很棒的答案。这也会对我有所帮助。 - Ashish Kakkad

-1

将自定义字体添加到您的项目中,即将字体文件(CALIBRIZ_0.TTF)拖入XCode项目。

编辑Info.plist:添加一个新条目,键为“应用提供的字体”。

对于每个文件,请将文件名添加到此数组

现在将字体设置为您的标签

yourLabel.font = [UIFont fontWithName:@"Calibri" size:15];

-2
如果您想在同一位置更改所有UILabel的字体,您需要创建一个UILabel的类别。
例如:
#import <UIKit/UIKit.h>

@interface UILabel (AppFont)

@end


@implementation UILabel (AppFont)

-(void)awakeFromNib
{
    self.font = [UIFont fontWithName:@"yourCustomFont" size:self.font.pointSize];
}


@end

在创建类别之后,您需要为所有文件导入此类,或将其添加到项目的“.pch”文件中。

按钮/文本视图的解决方案相同。


2
永远不要使用分类重写一个方法,这是未定义的行为。而且这段代码假设所有标签都是通过nibs创建的。对于任何通过代码创建的标签都没有帮助。 - rmaddy

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