iOS开发第三方字体使用

在开发中难免会遇到各种各样的需求, 刚刚实现了一个需求, 所以即使整理下, 希望遇到同样问题的同学少走弯路! 好了言归正传, 今天主要总结一下第三方字体的使用!

  1. 首先要从第三方找到字体库文件. 经过我的实践iOS系统是可以支持.ttf格式的字体库的, 因此只需要下载产品需要的字体库就OK了, 具体下载过程不再赘述, 相信你能找到这篇文章, 一定也能找到下载的地方, 我这里下载了一个隶书作为示例!

  2. 创建一个FontTest项目, 然后将刚刚下载的字体文件导入到项目中.

  3. 这一步很重要如果没有这一步, 系统是无法读取到字体文件的, 如下图, 打开当前项目的Info.plist文件, 增加一个Fonts provided by application项目并展开添加你的字体文件名到item0对应的值上, 如果你有多个字体文件, 那么你就多建几个item一一对应上你的文件名即可.


    iOS开发第三方字体使用_第1张图片
    图1.png
  4. 接下来就是字体使用了, 以前设置字体一般都是使用 systemFontOfSize:这个方法, 现在只需要使用fontWithName:size: 如下代码:

- (void)viewDidLoad {
    [super viewDidLoad];
    // Do any additional setup after loading the view, typically from a nib.
    
    [self test];
}
- (void)test {
    self.testLabel.text = @"我是隶书, 我是隶书";
    self.testLabel.font = [UIFont fontWithName:@"LiSu" size:15];
  
}
  1. 运行结果如下图2:


    iOS开发第三方字体使用_第2张图片
    图2.png
  2. OK大工搞成, 是不是觉得很简单, 其实里面还有很多细节要处理.

细节:
我如何获取字体名称, 大家看到我上面直接使用的是LiSu, 但是这个名称又是从哪里来的呢? 哈哈, 这是个关键, 下面说两种方法先说用代码实现:

  • 第一种方法: 思路就是 在字体库导入之前打印一下系统的字体库, 然后导入自己的字体库, 通过对比找出你安装的字体名称, 虽然笨但是也可以实现, 代码如下:
  NSArray *fontFamilys = [UIFont familyNames];
    for (NSString *familyName in fontFamilys) {
        NSLog(@"family name : %@",familyName);
        NSArray *fontNames = [UIFont fontNamesForFamilyName:familyName];
        for (NSString *fontName in fontNames) {
            NSLog(@"font name : %@",fontName);
        }
    }

对比两次打印结果即可找出字体名称;,

  • 第二种方法: 直接在mac 上双击字体文件, 系统会弹出一个安装框, 安装之后即可查看字体名称了, so easy !

最后在说一点比较重要的东西, 就是有可能你的项目已经是老项目, 或者已经开发完成的项目, 这个时候如果产品要求全部更换字体, 瞬间你是不是要崩溃了, 擦, 这么多设置字体的地方我的改到猴年马月呀! 哈哈, 既然有这个问题那么不妨就说说这个问题的解决方案吧! 也是目前我认为最好的解决方案, 那就是利用运行时(runtime
)的交换方法, 当然如果你有时间挨个替换最好是替换, 因为苹果不希望开发者使用太多运行时的东西!
首先创建一个UIfont的分类 ,姑且叫fontChangeName吧! 代码如下:


+ (void)load{
    [super load];
    static dispatch_once_t onceToken;
    dispatch_once(&onceToken, ^{
        Method oldMethod = class_getClassMethod([self class], @selector(systemFontOfSize:));
        Method newMethod = class_getClassMethod([self class], @selector(jl_changeNameFontOfSize:));
        
        Method oldMethod1 = class_getClassMethod([self class], @selector(boldSystemFontOfSize:));
        Method newMethod2 = class_getClassMethod([self class], @selector(jl_changeNameBoldFontOfSize:));
        
        method_exchangeImplementations(oldMethod, newMethod);
        method_exchangeImplementations(oldMethod1, newMethod2);
    });
}
+ (UIFont *)jl_changeNameFontOfSize:(CGFloat)fontSize{
    UIFont *font = [UIFont fontWithName:@"LiSu" size:fontSize];
    if (!font)return [self jl_changeNameFontOfSize:fontSize];
    return font;
}
+ (UIFont *)jl_changeNameBoldFontOfSize:(CGFloat)fontSize{
    UIFont *font = [UIFont fontWithName:@"LiSu" size:fontSize];
    if (!font)return [self jl_changeNameBoldFontOfSize:fontSize];
    return font;
}

在load方法中去交换系统方法和自己的方法, 这样在调用系统的方法时就会调用自己写的方法, 这样就把字体
的名称全部修改了.

那么肯定还有有人提出问题, 有些字体我不想修改怎么办呢? 其实好办, 只需要将自己写的方法, 在分类的头文件中声明一下, 在想使用系统方法的地方直接调用即可! 因为直接调用你自己的方法就相当于调用系统的方法了! 写到这字体部分基本完成, 如果在使用过程中还有问题, 请@我, 大家一起学习交流!

              我是----------Coding--------------Life------------Running--------------底线

你可能感兴趣的:(iOS开发第三方字体使用)