iOS開發(fā)-UILabel,UIFont更換字體(全部更換為三方字體)

最近在項(xiàng)目中,被要求將系統(tǒng)的蘋方體全部更換為三方字體,其實(shí)更換全部字體相對(duì)比更換部分字體來的簡(jiǎn)單,我們可以使用runtime來解決.

將字體添加到項(xiàng)目中

添加到項(xiàng)目中
  • 將字體拖入系統(tǒng)resource中, 注意選擇add to taget選項(xiàng)


    add to target
  • 打開Target 的Build Phases --> Copy Bundle Resource 看一下字體是否在這個(gè)標(biāo)簽下 如果沒有 點(diǎn)擊 + 添加一下即可.


    Copy Bundle Resource
  • 然后點(diǎn)擊 info 選項(xiàng), 添加一個(gè)字段 Fonts provided by application 這是一個(gè)數(shù)組, 在數(shù)組中添加 item 每個(gè)item 就是字體的名字.


    info.plist

使用字體

  • 注意: 添加進(jìn)的.tff文件可能不是字體真正的名字, 我們需要遍歷找到剛剛添加的字體.用一下代碼遍歷查找, 添加到appDelegate的didFinishLaunchingWithOptions方法中即可.
for(NSString *fontFamilyName in [UIFont familyNames]) {
       NSLog(@"fontFamilyName:'%@'",fontFamilyName);
       for(NSString *fontName in [UIFont fontNamesForFamilyName:fontFamilyName]) {
           NSLog(@"    font:'%@'",fontName);
       }
       NSLog(@"*****************************");
   }

區(qū)域更換字體(更換某個(gè)UILabel的字體)

  • 找到字體名字就可以使用這個(gè)三方字體了, 可以用 [UIFont fontWithName:@"" size:];

更換全部文字的字體

替換 UILabel 的方法

  • 筆者在接到更換字體需求的時(shí)候幾乎已經(jīng)快完成項(xiàng)目了,單個(gè)UILabel更換顯然已經(jīng)是不太可能了.網(wǎng)上搜索發(fā)現(xiàn)可以使用runtime來在運(yùn)行時(shí)更換UILabel的方法.

  • +load 方法在加載類的時(shí)候就被調(diào)用, iOS 應(yīng)用啟動(dòng)的時(shí)候伤疙,就會(huì)加載所有的類,所以就會(huì)調(diào)用每個(gè)類的 +load 方法辆影。

  • 在 +load 方法中 替換UILabel的可能的初始化方法,在新方法里面設(shè)置UILabel的字體,這樣就更換了所有UILabel的字體.

  • 注意:在重寫+load的時(shí)候 要先給父類初始化 調(diào)用 [super load] 方法. 然后使用GCD創(chuàng)建一個(gè)dispatch_once_t 保證這段代碼只執(zhí)行一次.

  • 系統(tǒng)的初始化方法和自定義的方法 在runtime中都是 SEL類型. 創(chuàng)建兩個(gè)方法.要實(shí)現(xiàn)自定的方法設(shè)置字體. 例如:

SEL originalSelector = @selector(init);
SEL swizzledSelector = @selector(QQInit);
  • 分別get兩個(gè)實(shí)例方法
    Method originalMethod = class_getInstanceMethod(class, originalSelector);
    Method swizzledMethod = class_getInstanceMethod(class, swizzledSelector);

  • 然后我們直接替換兩個(gè)方法即可

method_exchangeImplementations(originalMethod, swizzledMethod);
  • 自定義方法的實(shí)現(xiàn)
- (instancetype)QQInit {
   id __self = [self QQInit];
   UIFont * font = [UIFont fontWithName:@"FZSEK--GBK1-0" size:self.font.pointSize];
   if (font) {
       self.font=font;
   }
   return __self;
}

替換 UIFont 的方法

  • 上面完成之后我們會(huì)發(fā)現(xiàn)有一部分的字體沒有被替換, 可能是因?yàn)槲覀冊(cè)赨ILabel初始化之后又調(diào)用了一下幾個(gè)方法 這幾個(gè)方法中有設(shè)置systemFont的作用.所以又被設(shè)置為系統(tǒng)的蘋方字了,所以我們還要使用runtime來替換UIFont的這幾個(gè)方法.
    + (UIFont *)systemFontOfSize:(CGFloat)fontSize;
    + (UIFont *)boldSystemFontOfSize:(CGFloat)fontSize;
    + (UIFont *)italicSystemFontOfSize:(CGFloat)fontSize;

  • 替換方法是一樣的,只不過這幾個(gè)方法是類方法, 所以在getMethod的時(shí)候就不能使用class_getInstanceMethod而要使用class_getClassMethod

  • 自定義方法的實(shí)現(xiàn)

+(UIFont *)QQsystemFontOfSize:(CGFloat)fontSize {
   UIFont * font = [UIFont fontWithName:@"FZSEK--GBK1-0" size:fontSize];
   if (!font) {
       return [self QQsystemFontOfSize:fontSize];
   }
   return font;
}

Test

UILabel *lab = [[UILabel alloc] initWithFrame:self.view.bounds];
lab.text = @"按時(shí)到合肥拉薩交電話費(fèi)拉還是快遞費(fèi)盧卡斯 阿薩德會(huì)盡快了粉紅色的拉客戶放假啦是肯定會(huì)發(fā)生良好的會(huì)計(jì)法哈收了的看法和沙拉肯定會(huì)發(fā)了卡薩丁";
lab.font = [UIFont systemFontOfSize:19];
lab.numberOfLines = 0;
[self.view addSubview:lab];
  • 上面的代碼設(shè)置了文字,也是設(shè)置了系統(tǒng)文字的大小,但是并不妨礙我們更換字體.

效果

參考文章-->地址
GitHub-->Demo地址

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市次慢,隨后出現(xiàn)的幾起案子旁涤,更是在濱河造成了極大的恐慌拭抬,老刑警劉巖侵蒙,帶你破解...
    沈念sama閱讀 211,265評(píng)論 6 490
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異算凿,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)氓轰,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,078評(píng)論 2 385
  • 文/潘曉璐 我一進(jìn)店門署鸡,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人时捌,你說我怎么就攤上這事炉抒。” “怎么了拿诸?”我有些...
    開封第一講書人閱讀 156,852評(píng)論 0 347
  • 文/不壞的土叔 我叫張陵亩码,是天一觀的道長(zhǎng)野瘦。 經(jīng)常有香客問我,道長(zhǎng),這世上最難降的妖魔是什么蠢络? 我笑而不...
    開封第一講書人閱讀 56,408評(píng)論 1 283
  • 正文 為了忘掉前任刹孔,我火速辦了婚禮,結(jié)果婚禮上髓霞,老公的妹妹穿的比我還像新娘卦睹。我一直安慰自己,他們只是感情好方库,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,445評(píng)論 5 384
  • 文/花漫 我一把揭開白布纵潦。 她就那樣靜靜地躺著垃环,像睡著了一般遂庄。 火紅的嫁衣襯著肌膚如雪劲赠。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 49,772評(píng)論 1 290
  • 那天霹肝,我揣著相機(jī)與錄音预厌,去河邊找鬼。 笑死苗沧,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的待逞。 我是一名探鬼主播识樱,決...
    沈念sama閱讀 38,921評(píng)論 3 406
  • 文/蒼蘭香墨 我猛地睜開眼震束,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來了割疾?” 一聲冷哼從身側(cè)響起嘉栓,我...
    開封第一講書人閱讀 37,688評(píng)論 0 266
  • 序言:老撾萬榮一對(duì)情侶失蹤侵佃,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后馋辈,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 44,130評(píng)論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡枢劝,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,467評(píng)論 2 325
  • 正文 我和宋清朗相戀三年您旁,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片鹤盒。...
    茶點(diǎn)故事閱讀 38,617評(píng)論 1 340
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡侦锯,死狀恐怖秦驯,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情亲桥,我是刑警寧澤,帶...
    沈念sama閱讀 34,276評(píng)論 4 329
  • 正文 年R本政府宣布题篷,位于F島的核電站番枚,受9級(jí)特大地震影響损敷,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜拗馒,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,882評(píng)論 3 312
  • 文/蒙蒙 一瘟忱、第九天 我趴在偏房一處隱蔽的房頂上張望苫幢。 院中可真熱鬧,春花似錦触菜、人聲如沸哀峻。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,740評(píng)論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽丙号。三九已至,卻和暖如春犬缨,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背刺彩。 一陣腳步聲響...
    開封第一講書人閱讀 31,967評(píng)論 1 265
  • 我被黑心中介騙來泰國(guó)打工创倔, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人三幻。 一個(gè)月前我還...
    沈念sama閱讀 46,315評(píng)論 2 360
  • 正文 我出身青樓呐能,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親朗徊。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,486評(píng)論 2 348

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