编辑
如果对系统自带的字体不满意,那么怎么才能全局替换默认字体。
本文访问次数:0
  1. 1. Android解决方法
    1. 1.1. 创建文件夹
    2. 1.2. 初始化
    3. 1.3. 绑定Actiity
  2. 2. iOS下的解决方法
    1. 2.1. 导入字体文件
    2. 2.2. 修改Info.plist
    3. 2.3. 查找字体名称
    4. 2.4. 全局替换

Android解决方法

Android下推荐使用Calligraphy

创建文件夹

在assets文件夹下创建fonts文件夹,然后放入字体文件,例如default.ttf

初始化

在Application中

@Override
public void onCreate() {
    super.onCreate();
    CalligraphyConfig.initDefault(new CalligraphyConfig.Builder()
                            .setDefaultFontPath("fonts/Roboto-RobotoRegular.ttf")
                            .setFontAttrId(R.attr.fontPath)
                            .build()
            );
    //....
}

绑定Actiity

在Activity中

@Override
protected void attachBaseContext(Context newBase) {
    super.attachBaseContext(CalligraphyContextWrapper.wrap(newBase));
}

通过以上方法就可以全局修改默认字体了,如果要通过主题修改字体,请参考官方文档

iOS下的解决方法

iOS下使用原生字体更改方法,然后使用Category或者Method Swizzling解决全局替换。首先看一下如何添加自定义字体

导入字体文件

将下载好的ttf文件或者otf文件拖入项目中,确保Build Phases->Copy Bundle Resources包含该文件

修改Info.plist

添加Fonts provided by application字段,并输入所有字体,Value填写文件名称,如下所示

Fonts provided by application
-- item01            default.ttf

查找字体名称

代码中使用的字体名称不一定是文件名称,我们需要其它方法查看family name和对应的font name,例如使用Objective-C

for (NSString* family in [UIFont familyNames])
{
    NSLog(@"%@\n", family);

    for (NSString* name in [UIFont fontNamesForFamilyName: family])
    {
        NSLog(@"==%@\n", name);
    }
}

打印结果为

...
Noteworthy
==Noteworthy-Light
==Noteworthy-Bold
...

代码调用如下

UIFont*font = [UIFont fontWithName:@"Noteworthy-Bold" size:14.0f];

全局替换

建议创建UIFont的Category类,然后创建默认字体方法,例如

//UIFont+Default.h
+ (UIFont*)defaultFont;

//UIFont+Default.m
+ (UIFont*)defaultFont{
    return [UIFont fontWithName:@"Noteworthy-Bold" size:14.0f];
}

如果要强制所有字体都修改为自定义字体,可以通过Method Swizzling实现,具体代码请查看github gist,有关method swizzling的详细资料还可以查看这篇文章

没有任何评论