iOS中利用 runtime 一鍵改變字型

發表於2016-05-03

忙忙忙!!!好久沒寫部落格了,前段時間實在是每天滿滿的,回去了累了也不想寫了,只是躺床上看一會東西。最近公司要在5月份舉辦個大型的釋出會,所以在這之前要把版本穩定,介面提升,所以有很多細活要幹。

iOS中利用 runtime 一鍵改變字型

不過,趁前兩天版本剛提交上線,這兩天稍微閒一點,就把之前說的利用runtime一鍵改變字型的方法分享出來。有人會說,改變字型不是很簡單嗎,我直接找到字型名替換一下不就好了?客官不要急,先坐下來吃點瓜子,聽我慢慢給你說來。

1、準備


我們新建一個專案名叫ChangeFont,然後我就隨便找了個名叫loveway.ttf的字型庫拖進去,裡面的工程目錄大概就是這樣的

iOS中利用 runtime 一鍵改變字型

目錄

現在我們就簡單的直接在storyboard上拖了一個label一個button,約束好,像這樣

iOS中利用 runtime 一鍵改變字型

storyboard

嗯,就這樣,很簡單,執行

iOS中利用 runtime 一鍵改變字型

執行結果

好的顯示正常,沒什麼問題,接下來改變字型。

2、改變字型


我們之前已經把loveway.ttf這個檔案拖進去了,現在在plist檔案裡面配置一下。開啟plist然後加入名為Fonts provided by application的一行,在item裡把我們的字型名字加進去

iOS中利用 runtime 一鍵改變字型

plist

最後我們需要保證我們確確實實是加進來了

iOS中利用 runtime 一鍵改變字型

phases

這個時候也許你已經迫不及待了,趕緊改字型,如下

執行。。。oh no !怎麼沒變,還是原來的樣子

iOS中利用 runtime 一鍵改變字型

肯定是姿勢不對,於是百度了一下(雖然我一般都用谷歌),的確這種方法不對

iOS中利用 runtime 一鍵改變字型

於是改變思路,先找出字型的名字,Like this,程式碼改成這樣

執行一看控制檯

iOS中利用 runtime 一鍵改變字型

輸出的字型名稱部分截圖

這什麼鬼,我哪知道我剛加進去的字型名稱是什麼,這咋找

iOS中利用 runtime 一鍵改變字型

於是想出來個辦法,再建一個工程,不加入loveway.ttf這個字型,列印出來,一個個對比,多的那個不就是了嗎!bingo,於是花了一會功夫終於找出來了,是FZLBJW--GB1-0,不管了,先試試看行不行

執行,結果如下

iOS中利用 runtime 一鍵改變字型

改變字型後的執行結果

OK!達到效果了,雖然有點挫,但是效果達到了,還不錯

iOS中利用 runtime 一鍵改變字型

到這裡,基本的改變字型效果已達到。

3、查詢字型的一種簡單的方法


在上面我們可以看到,通過對比的方法找到了FZLBJW--GB1-0這個名字,這裡,有一種簡單的方法,
我們在 Finder 裡面找到這個ttf,雙擊開啟(在Xcode裡面雙擊開啟沒效果),這時候系統就會用蘋果自帶的字型冊開啟,如下

iOS中利用 runtime 一鍵改變字型

使用字型冊開啟.rtf

這樣我們就可以看到了這個字型的族科名字,我們看到的是FZLiBian-S02S,於是我們在剛才輸出全部字型名的控制檯搜尋一下這個族科名,就可以知道具體的字型名了

iOS中利用 runtime 一鍵改變字型

搜尋FZLiBian-S02S

這樣就比上面簡單多了。

4、進一步的思考


上面例子中簡單的說了一下改變字型的方法,雖然成功了,但是我們不得不思考一下。上面只是兩個簡單的控制元件,那麼我要是有一堆控制元件怎麼辦?或者你可以說我也可用這種方法一個個加,你要是純程式碼寫的還好,你要是xib寫的,難道還要把一個個無用的只是顯示一下的label或者button拉出來這樣寫嗎?這樣的話,效率肯定會非常低,尤其是那些寫到一半的大工程,感覺這種方法肯定是行不通的。
這裡利用runtimeclass_addMethodclass_replaceMethodmethod_exchangeImplementations這幾個方法,然後根據+ (void)load這個方法的特性實現(關於+ (void)load這個方法後面會說,或者不懂得童鞋可以先查查資料),程式碼如下

然後不加任何程式碼如下

執行

iOS中利用 runtime 一鍵改變字型

我們可以看到字型改變了。
如果有人說我有的想改變字型有的不想改變字型怎麼辦,我這裡有個簡單的辦法就是設定tag,比如我設定labeltag10086(隨便起的),就讓他字型不改變

iOS中利用 runtime 一鍵改變字型

執行結果

iOS中利用 runtime 一鍵改變字型

注意:
1、如果你是程式碼寫控制元件,你不想改變字型,你只需在建立的時候設定tag10086
2、上面程式碼中註釋了一行

這個是當時寫的時候不改變buttontitle字型設定的,在這裡你可以判斷那種型別的改哪種不改,比如說你不想改button的字型,把這一句解註釋即可
3、如果你是xib拉的控制元件,你不想改變字型,你必須在xib介面設定tag10086,不可載入完畢後在- (void)viewDidLoad裡面設定,這還是因為+ (void)load這個方法

  • 在一個程式(main函式)執行之前,所用到的庫被載入到runtime之後,被新增到的runtime系統的各種類和category的+load方法就被呼叫;(關於這點很容易通過列印語句來驗證);
  • 如果父類和子類的+load方法都被呼叫,父類的呼叫一定在子類之前,這是系統自動完成的,子類+load中沒必要顯式呼叫[super load];;
    這裡只是簡單的說一下,具體不理解的可以翻翻官方文件

5、最後

關於程式碼的解釋,在工程裡都已經註釋的非常清楚了,這裡就不多說了,不清楚的童鞋可以給我留言。具體用法很簡單,你只需要將UILabel+FontChange.hUILabel+FontChange.m拉進你的工程即可。
需要下載更多字型的可以在 字型庫下載,所有的程式碼都可以在 這裡下載。
最近在看swift,做了一下筆記,後面會為大家分享總結的一些swift tips
最後,如果你有什麼建議或者指正的地方請給我留言,如果喜歡或者對你有幫助的話,就請star一下吧,謝謝!

相關文章