項目中如果只是使用幾種固定的字體,可以本地添加自定義字體屠橄,可以參考iOS加入自定義字體庫 這篇文章詳細的說明如何在本地添加自定義字體
如果本地添加的幾種字體難以滿足需求族跛,這時候就會使用從服務器動態(tài)下發(fā)字體的方式來實現(xiàn),這時候就需要動態(tài)的向字體庫中注冊自定義字體锐墙,然后再調(diào)用[UIFont fontWithName: size:]
方法設置字體
先說下思路:
- 下載字體到APP的沙盒中礁哄,并獲取到ttf文件路徑
- 判斷路徑是否存在且有效
- 使用文件路徑注冊自定義字體
- 返回字體名稱
- 調(diào)用
[UIFont fontWithName: size:]
方法設置字體
思路有了,剩下的就是實現(xiàn)
在實現(xiàn)之前溪北,還需要對功能進行設計桐绒,比如怎么封裝才能讓這個功能簡單易用夺脾?又要對外暴露哪些接口?效率等都是需要我們考慮的
在項目中茉继,這個下載應該分屬于下載模塊咧叭,對于我們封裝注冊字體是不需要管的,同時烁竭,項目中注冊的字體可能有很多菲茬,這個根據(jù)需求來定,所以我們可以使用單例實現(xiàn)這個功能派撕。
記住我們的目標:給我一個字體路徑婉弹,我就返回給你一個字體名稱
1. 設計對外提供的接口
為了調(diào)用的方便性,我們可以對外暴露一個類方法供使用者調(diào)用
+ (NSString *)registerFontWithPath:(NSString *)path;
2. 參數(shù)合法性校驗
在實現(xiàn)內(nèi)部终吼,我們需要判斷參數(shù)的合法性
BOOL isDir;
BOOL isExist = [[NSFileManager defaultManager] fileExistsAtPath:fontPath isDirectory:&isDir];
// 路徑是否存在镀赌,且路徑非目錄
if (fontPath.length <= 0 || !isExist || (isExist && isDir)) {
return nil;
}
3. 注冊字體并返回
NSURL *fontUrl = [NSURL fileURLWithPath:fontPath];
CGDataProviderRef fontDataProvider = CGDataProviderCreateWithURL((__bridge CFURLRef)fontUrl);
CGFontRef fontRef = CGFontCreateWithDataProvider(fontDataProvider);
CGDataProviderRelease(fontDataProvider);
CTFontManagerRegisterGraphicsFont(fontRef, NULL);
fontName = CFBridgingRelease(CGFontCopyPostScriptName(fontRef));
CGFontRelease(fontRef);
return fontName;
到這里,動態(tài)注冊字體的介紹已經(jīng)結(jié)束际跪。
這樣的設計雖然可以商佛,但是為了app的性能,在這個單例里面還可以> 再加入字體緩存垫卤,當同一個字體路徑多次請求的時候威彰,只需要先查找> 緩存中是否有該字體,有的話直接從緩存中獲取即可穴肘,這樣可以避免> 重復的注冊字體浪費資源。
參照iOS方法查找