Objective-C Runtime使用之全局字體替換為第三方字體

iOS開發(fā)里頭馆里,常用的設(shè)置字體方式是使用UIFont的systemFontOfSize這個Class Method震叙,在一半情況下都算夠用均芽。

在客戶端中使用特定的字體倚评,我們可以通過手動給工程添加配置字體的ttf文件(字體庫)

然后通過fontWithName:name size:size這個 Class Method即可選用浦徊,然而在一個已經(jīng)經(jīng)過長時間開發(fā)的客戶端,會有歷史遺漏問題

導(dǎo)致整個工程的字體配置可能存在修改工作量大天梧,改漏改錯等情況盔性,針對這種情況我們也可以通過runtime來解決。

1呢岗、導(dǎo)入第三方字體

首先需要下載一個.ttf為后綴的文件冕香,也就是字體庫。下載后將文件導(dǎo)入工程后豫,如圖


接著需要在工程配置info.plist中添加這個字體

在info.plist中添加一行悉尾,key是Fonts provided by application,中文意思即 字體由應(yīng)用程序提供

這是個array對象挫酿,那么我們把它展開

往里面添加一個item构眯,內(nèi)容即我們剛剛添加的那個文件名

然后在Build Phases里添加資源文件 如圖

接下來可以在工程中,通過UIFont 這個類 遍歷我們現(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); } }

注意 早龟,不同的iOS大版本之間惫霸,可使用的字體庫會有差異猫缭,但是我們這里只需要取到我們手動添加的字體

遍歷出來的內(nèi)容很多,不翻頁也不好找到我們添加的字體它褪。我這里添加的字體是微軟雅黑饵骨,那么我搜一下也是可以找到的翘悉,這里我們需要取font name茫打,即圖上的2016-11-21 09:49:45.780 FontDemo[17853:921926] font name : MicrosoftYaHei取到字體名字,我們就可以通過

[UIFont fontWithName:@"MicrosoftYaHei" size:16];fontWithName: size: 這個類方法去得到我們需要的UIFont對象妖混,也就是雅黑字體

? ? ?------------------------------華麗的分割線--------------------------

好了老赤,單個字體的更換這里是實(shí)現(xiàn)了,但是我這里需要的是全局的字體修改接下來的內(nèi)容又要接觸到objc runtime 的method exchange了制市,也就是method swizzling在Objective-c中抬旺,hook方案能解決很多問題,這里的問題是其中之一但是這種全局設(shè)置的方法交換也有一定的局限性祥楣,比如 我需要再換其他字體呢开财? 這個問題后面再探討開始設(shè)置method swizzling首先 建立一個UIFont的categroy在.m文件中 實(shí)現(xiàn)load方法,并調(diào)用父類load+ (void)load{ [super load]; }

接著 做method swizzling的過程 只需要調(diào)用一次误褪,那么可以用gcd的once 執(zhí)行责鳍,

+ (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(__nickyfontchanger_YaheiFontOfSize:)); method_exchangeImplementations(oldMethod, newMethod); });?

}別忘了#import解析一下上面這幾句代碼

首先Method即方法,class_getClassMethod這是獲取類方法兽间,因?yàn)槲覀冊瓉硎褂玫膕ystemFontOfSize是個類方法历葛。

如果要交換的是實(shí)例方法,那么就要用class_getInstanceMethod 獲取

先獲取舊的方法嘀略,再獲取新的方法恤溶,新的方法是寫在這個category里的

像我這里:

+ (UIFont *)__nickyfontchanger_YaheiFontOfSize:(CGFloat)fontSize{ UIFont *font = [UIFont fontWithName:@"MicrosoftYaHei" size:fontSize];?

if (!font)return [self __nickyfontchanger_YaheiFontOfSize:fontSize]; return font; }

再來解析一下這個方法的執(zhí)行:

首先獲取我們的第三方字體,若字體不存在帜羊,則返回系統(tǒng)默認(rèn)字體

但是為什么我返回系統(tǒng)默認(rèn)字體的時候咒程,調(diào)用的是 [self __nickyfontchanger_YaheiFontOfSize:fontSize]呢?

因?yàn)榉椒ㄒ呀?jīng)交換了讼育,實(shí)際上這個方法的pointer指向的是系統(tǒng)的systemFontOfSize這個方法

具體的實(shí)現(xiàn)


單獨(dú)給某個字體設(shè)置成系統(tǒng)字體怎么辦帐姻?

事實(shí)上我們這里只是把兩個方法交換了而已,所以我們只要把+ (UIFont *)__nickyfontchanger_YaheiFontOfSize:(CGFloat)fontSize;這個方法寫到.h的聲明里面即可窥淆,它實(shí)際就是系統(tǒng)字體

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末卖宠,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子忧饭,更是在濱河造成了極大的恐慌扛伍,老刑警劉巖,帶你破解...
    沈念sama閱讀 217,277評論 6 503
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件词裤,死亡現(xiàn)場離奇詭異刺洒,居然都是意外死亡鳖宾,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,689評論 3 393
  • 文/潘曉璐 我一進(jìn)店門逆航,熙熙樓的掌柜王于貴愁眉苦臉地迎上來鼎文,“玉大人,你說我怎么就攤上這事因俐∧赐铮” “怎么了?”我有些...
    開封第一講書人閱讀 163,624評論 0 353
  • 文/不壞的土叔 我叫張陵抹剩,是天一觀的道長撑帖。 經(jīng)常有香客問我,道長澳眷,這世上最難降的妖魔是什么胡嘿? 我笑而不...
    開封第一講書人閱讀 58,356評論 1 293
  • 正文 為了忘掉前任,我火速辦了婚禮钳踊,結(jié)果婚禮上衷敌,老公的妹妹穿的比我還像新娘。我一直安慰自己拓瞪,他們只是感情好缴罗,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,402評論 6 392
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著吴藻,像睡著了一般瞒爬。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上沟堡,一...
    開封第一講書人閱讀 51,292評論 1 301
  • 那天侧但,我揣著相機(jī)與錄音,去河邊找鬼航罗。 笑死禀横,一個胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的粥血。 我是一名探鬼主播柏锄,決...
    沈念sama閱讀 40,135評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼复亏!你這毒婦竟也來了趾娃?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 38,992評論 0 275
  • 序言:老撾萬榮一對情侶失蹤缔御,失蹤者是張志新(化名)和其女友劉穎抬闷,沒想到半個月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,429評論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡笤成,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,636評論 3 334
  • 正文 我和宋清朗相戀三年评架,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片炕泳。...
    茶點(diǎn)故事閱讀 39,785評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡纵诞,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出培遵,到底是詐尸還是另有隱情浙芙,我是刑警寧澤,帶...
    沈念sama閱讀 35,492評論 5 345
  • 正文 年R本政府宣布荤懂,位于F島的核電站茁裙,受9級特大地震影響塘砸,放射性物質(zhì)發(fā)生泄漏节仿。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,092評論 3 328
  • 文/蒙蒙 一掉蔬、第九天 我趴在偏房一處隱蔽的房頂上張望廊宪。 院中可真熱鬧,春花似錦女轿、人聲如沸箭启。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,723評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽傅寡。三九已至,卻和暖如春北救,著一層夾襖步出監(jiān)牢的瞬間荐操,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 32,858評論 1 269
  • 我被黑心中介騙來泰國打工珍策, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留托启,地道東北人。 一個月前我還...
    沈念sama閱讀 47,891評論 2 370
  • 正文 我出身青樓攘宙,卻偏偏與公主長得像屯耸,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子蹭劈,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,713評論 2 354

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