在開發中難免會遇到各種各樣的需求, 剛剛實現了一個需求, 所以即使整理下, 希望遇到同樣問題的同學少走彎路! 好了言歸正傳, 今天主要總結一下第三方字體的使用!
首先要從第三方找到字體庫文件. 經過我的實踐iOS系統是可以支持.ttf格式的字體庫的, 因此只需要下載產品需要的字體庫就OK了, 具體下載過程不再贅述, 相信你能找到這篇文章, 一定也能找到下載的地方, 我這里下載了一個隸書作為示例!
創建一個FontTest項目, 然后將剛剛下載的字體文件導入到項目中.
-
這一步很重要如果沒有這一步, 系統是無法讀取到字體文件的, 如下圖, 打開當前項目的Info.plist文件, 增加一個Fonts provided by application項目并展開添加你的字體文件名到item0對應的值上, 如果你有多個字體文件, 那么你就多建幾個item一一對應上你的文件名即可.
圖1.png 接下來就是字體使用了, 以前設置字體一般都是使用 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];
}
-
運行結果如下圖2:
圖2.png 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--------------底線
?
?