iOS開發(fā)第三方字體使用

在開發(fā)中難免會(huì)遇到各種各樣的需求, 剛剛實(shí)現(xiàn)了一個(gè)需求, 所以即使整理下, 希望遇到同樣問(wèn)題的同學(xué)少走彎路! 好了言歸正傳, 今天主要總結(jié)一下第三方字體的使用!

  1. 首先要從第三方找到字體庫(kù)文件. 經(jīng)過(guò)我的實(shí)踐iOS系統(tǒng)是可以支持.ttf格式的字體庫(kù)的, 因此只需要下載產(chǎn)品需要的字體庫(kù)就OK了, 具體下載過(guò)程不再贅述, 相信你能找到這篇文章, 一定也能找到下載的地方, 我這里下載了一個(gè)隸書作為示例!

  2. 創(chuàng)建一個(gè)FontTest項(xiàng)目, 然后將剛剛下載的字體文件導(dǎo)入到項(xiàng)目中.

  3. 這一步很重要如果沒(méi)有這一步, 系統(tǒng)是無(wú)法讀取到字體文件的, 如下圖, 打開當(dāng)前項(xiàng)目的Info.plist文件, 增加一個(gè)Fonts provided by application項(xiàng)目并展開添加你的字體文件名到item0對(duì)應(yīng)的值上, 如果你有多個(gè)字體文件, 那么你就多建幾個(gè)item一一對(duì)應(yīng)上你的文件名即可.


    圖1.png
  4. 接下來(lái)就是字體使用了, 以前設(shè)置字體一般都是使用 systemFontOfSize:這個(gè)方法, 現(xiàn)在只需要使用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. 運(yùn)行結(jié)果如下圖2:


    圖2.png
  2. OK大工搞成, 是不是覺(jué)得很簡(jiǎn)單, 其實(shí)里面還有很多細(xì)節(jié)要處理.

細(xì)節(jié):
我如何獲取字體名稱, 大家看到我上面直接使用的是LiSu, 但是這個(gè)名稱又是從哪里來(lái)的呢? 哈哈, 這是個(gè)關(guān)鍵, 下面說(shuō)兩種方法先說(shuō)用代碼實(shí)現(xiàn):

  • 第一種方法: 思路就是 在字體庫(kù)導(dǎo)入之前打印一下系統(tǒng)的字體庫(kù), 然后導(dǎo)入自己的字體庫(kù), 通過(guò)對(duì)比找出你安裝的字體名稱, 雖然笨但是也可以實(shí)現(xiàn), 代碼如下:
  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);
        }
    }

對(duì)比兩次打印結(jié)果即可找出字體名稱;,

  • 第二種方法: 直接在mac 上雙擊字體文件, 系統(tǒng)會(huì)彈出一個(gè)安裝框, 安裝之后即可查看字體名稱了, so easy !

最后在說(shuō)一點(diǎn)比較重要的東西, 就是有可能你的項(xiàng)目已經(jīng)是老項(xiàng)目, 或者已經(jīng)開發(fā)完成的項(xiàng)目, 這個(gè)時(shí)候如果產(chǎn)品要求全部更換字體, 瞬間你是不是要崩潰了, 擦, 這么多設(shè)置字體的地方我的改到猴年馬月呀! 哈哈, 既然有這個(gè)問(wèn)題那么不妨就說(shuō)說(shuō)這個(gè)問(wèn)題的解決方案吧! 也是目前我認(rèn)為最好的解決方案, 那就是利用運(yùn)行時(shí)(runtime
)的交換方法, 當(dāng)然如果你有時(shí)間挨個(gè)替換最好是替換, 因?yàn)樘O果不希望開發(fā)者使用太多運(yùn)行時(shí)的東西!
首先創(chuàng)建一個(gè)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方法中去交換系統(tǒng)方法和自己的方法, 這樣在調(diào)用系統(tǒng)的方法時(shí)就會(huì)調(diào)用自己寫的方法, 這樣就把字體
的名稱全部修改了.

那么肯定還有有人提出問(wèn)題, 有些字體我不想修改怎么辦呢? 其實(shí)好辦, 只需要將自己寫的方法, 在分類的頭文件中聲明一下, 在想使用系統(tǒng)方法的地方直接調(diào)用即可! 因?yàn)橹苯诱{(diào)用你自己的方法就相當(dāng)于調(diào)用系統(tǒng)的方法了! 寫到這字體部分基本完成, 如果在使用過(guò)程中還有問(wèn)題, 請(qǐng)@我, 大家一起學(xué)習(xí)交流!

              我是----------Coding--------------Life------------Running--------------底線

?

?

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

推薦閱讀更多精彩內(nèi)容