iOS自定義字體(二):全局字體修改

全局修改UIFont字體:(包括UILabel和UIButton液兽、UITextField和UITextView的font字體闰挡,目前只對(duì)systemFontOfSize和boldSystemFontOfSize兩種方法有效)

完整代碼如下,復(fù)制添加到項(xiàng)目中即可使用惰拱,不明白的地方看代碼注釋即可:

UIFont+FontChange

UIFont+FontChange.h

//
//  UIFont+FontChange.h
//  degulade
//
//  Created by degulade on 2021/3/15.
//

import <UIKit/UIKit.h>
/// 默認(rèn)字體修改(systemFontOfSize、boldSystemFontOfSize、italicSystemFontOfSize)
@interface UIFont (FontChange)
@end

/// 修改UILabel和UIButton的lab字體咒循,對(duì)xib有效(xib加粗暫時(shí)待優(yōu)化)
@interface UILabel (FontChange)
@end

/// 修改UITextField和UITextView的lab字體,對(duì)xib有效(xib加粗暫時(shí)待優(yōu)化)
@interface UITextField (FontChange)

@end

UIFont+FontChange.m

//
//  UIFont+FontChange.m
//  degulade
//
//  Created by degulade on 2021/3/15.
//

//  自定義的正常字體
#define CustomFontName @"FZSJ-PIANPXHN"
//  自定義的粗字體
#define CustomBoldFontName @"AaKYTNon-CommercialUse"

#import "UIFont+FontChange.h"
#import <objc/runtime.h>


@implementation UIFont (FontChange)

+ (void)load {
    
    //  線程安全
    static dispatch_once_t onceToken;
    dispatch_once(&onceToken, ^{
        
        Class class = [self class];
        
        //  系統(tǒng)systemFontOfSize方法
        Method systemMethod = class_getClassMethod(class, @selector(systemFontOfSize:));
        //  自定義systemFontOfSize方法
        Method swizzMethod = class_getClassMethod(class, @selector(my_systemFontOfSize:));
        //  交換方法
        method_exchangeImplementations(systemMethod, swizzMethod);

        //  boldSystemFontOfSize
        Method systemMethod1 = class_getClassMethod(class, @selector(boldSystemFontOfSize:));
        Method swizzMethod1 = class_getClassMethod(class, @selector(my_boldSystemFontOfSize:));
        method_exchangeImplementations(systemMethod1, swizzMethod1);
        
        //  italicSystemFontOfSize
        Method systemMethod2 = class_getClassMethod(class, @selector(italicSystemFontOfSize:));
        Method swizzMethod2 = class_getClassMethod(class, @selector(my_italicSystemFontOfSize:));
        method_exchangeImplementations(systemMethod2, swizzMethod2);

    });
}


/// 自定義正常字體
/// @param size siz
+ (UIFont *)my_systemFontOfSize:(CGFloat)size {
    [UIFont my_systemFontOfSize:size];
    
    UIFont *font = [UIFont fontWithName:CustomFontName size:size];
    if (font) {
        return font;
    }
    //  字體缺失時(shí)防奔潰處理
    return [UIFont systemFontOfSize:size];
}

/// 自定義加粗字體
/// @param size siz
+ (UIFont *)my_boldSystemFontOfSize:(CGFloat)size {
    [UIFont my_boldSystemFontOfSize:size];

    UIFont *font = [UIFont fontWithName:CustomBoldFontName size:size];
    if (font) {
        return font;
    }
    return [UIFont boldSystemFontOfSize:size];
}


+ (UIFont *)my_italicSystemFontOfSize:(CGFloat)size {
    [UIFont my_italicSystemFontOfSize:size];

    UIFont *font = [UIFont fontWithName:CustomFontName size:size];
    if (font) {
        return font;
    }
    return [UIFont italicSystemFontOfSize:size];
}


@end




@implementation UILabel (FontChange)

+ (void)load {
    //方法交換應(yīng)該被保證绞愚,在程序中只會(huì)執(zhí)行一次
    static dispatch_once_t onceToken;
    dispatch_once(&onceToken, ^{
        //獲得viewController的生命周期方法的selector
        SEL systemSel = @selector(willMoveToSuperview:);
        //自己實(shí)現(xiàn)的將要被交換的方法的selector
        SEL swizzSel = @selector(myWillMoveToSuperview:);
        //兩個(gè)方法的Method
        Method systemMethod = class_getInstanceMethod([self class], systemSel);
        Method swizzMethod = class_getInstanceMethod([self class], swizzSel);
        
        //首先動(dòng)態(tài)添加方法叙甸,實(shí)現(xiàn)是被交換的方法,返回值表示添加成功還是失敗
        BOOL isAdd = class_addMethod(self, systemSel, method_getImplementation(swizzMethod), method_getTypeEncoding(swizzMethod));
        if (isAdd) {
            //如果成功位衩,說明類中不存在這個(gè)方法的實(shí)現(xiàn)
            //將被交換方法的實(shí)現(xiàn)替換到這個(gè)并不存在的實(shí)現(xiàn)
            class_replaceMethod(self, swizzSel, method_getImplementation(systemMethod), method_getTypeEncoding(systemMethod));
        } else {
            //否則裆蒸,交換兩個(gè)方法的實(shí)現(xiàn)
            method_exchangeImplementations(systemMethod, swizzMethod);
        }
        
    });
}

- (void)myWillMoveToSuperview:(UIView *)newSuperview {
    
    [self myWillMoveToSuperview:newSuperview];
    if (self) {
        /// 移除某個(gè)tag的自定義字體樣式
//        if (self.tag == 10086) {
//            self.font = [UIFont systemFontOfSize:self.font.pointSize];
//        } else {
            if ([UIFont fontNamesForFamilyName:CustomFontName])
                self.font  = [UIFont fontWithName:CustomFontName size:self.font.pointSize];
//        }
    }
}

@end




@implementation UITextField (FontChange)

+ (void)load {
    //方法交換應(yīng)該被保證,在程序中只會(huì)執(zhí)行一次
    static dispatch_once_t onceToken;
    dispatch_once(&onceToken, ^{
        //獲得viewController的生命周期方法的selector
        SEL systemSel = @selector(willMoveToSuperview:);
        //自己實(shí)現(xiàn)的將要被交換的方法的selector
        SEL swizzSel = @selector(myWillMoveToSuperview:);
        //兩個(gè)方法的Method
        Method systemMethod = class_getInstanceMethod([self class], systemSel);
        Method swizzMethod = class_getInstanceMethod([self class], swizzSel);
        
        //首先動(dòng)態(tài)添加方法糖驴,實(shí)現(xiàn)是被交換的方法僚祷,返回值表示添加成功還是失敗
        BOOL isAdd = class_addMethod(self, systemSel, method_getImplementation(swizzMethod), method_getTypeEncoding(swizzMethod));
        if (isAdd) {
            //如果成功佛致,說明類中不存在這個(gè)方法的實(shí)現(xiàn)
            //將被交換方法的實(shí)現(xiàn)替換到這個(gè)并不存在的實(shí)現(xiàn)
            class_replaceMethod(self, swizzSel, method_getImplementation(systemMethod), method_getTypeEncoding(systemMethod));
        } else {
            //否則,交換兩個(gè)方法的實(shí)現(xiàn)
            method_exchangeImplementations(systemMethod, swizzMethod);
        }
        
    });
}

- (void)myWillMoveToSuperview:(UIView *)newSuperview {
    [self myWillMoveToSuperview:newSuperview];
    if (self) {
        /// 移除某個(gè)tag的自定義字體樣式
//        if (self.tag == 10086) {
//            self.font = [UIFont systemFontOfSize:self.font.pointSize];
//        } else {
            if ([UIFont fontNamesForFamilyName:CustomFontName])
                self.font  = [UIFont fontWithName:CustomFontName size:self.font.pointSize];
//        }
    }
}


@end

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末辙谜,一起剝皮案震驚了整個(gè)濱河市俺榆,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌装哆,老刑警劉巖罐脊,帶你破解...
    沈念sama閱讀 221,198評(píng)論 6 514
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異蜕琴,居然都是意外死亡萍桌,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,334評(píng)論 3 398
  • 文/潘曉璐 我一進(jìn)店門凌简,熙熙樓的掌柜王于貴愁眉苦臉地迎上來上炎,“玉大人,你說我怎么就攤上這事雏搂》粗ⅲ” “怎么了?”我有些...
    開封第一講書人閱讀 167,643評(píng)論 0 360
  • 文/不壞的土叔 我叫張陵畔派,是天一觀的道長铅碍。 經(jīng)常有香客問我,道長线椰,這世上最難降的妖魔是什么胞谈? 我笑而不...
    開封第一講書人閱讀 59,495評(píng)論 1 296
  • 正文 為了忘掉前任,我火速辦了婚禮憨愉,結(jié)果婚禮上烦绳,老公的妹妹穿的比我還像新娘。我一直安慰自己配紫,他們只是感情好径密,可當(dāng)我...
    茶點(diǎn)故事閱讀 68,502評(píng)論 6 397
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著躺孝,像睡著了一般享扔。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上植袍,一...
    開封第一講書人閱讀 52,156評(píng)論 1 308
  • 那天惧眠,我揣著相機(jī)與錄音,去河邊找鬼于个。 笑死氛魁,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播秀存,決...
    沈念sama閱讀 40,743評(píng)論 3 421
  • 文/蒼蘭香墨 我猛地睜開眼捶码,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了或链?” 一聲冷哼從身側(cè)響起宙项,我...
    開封第一講書人閱讀 39,659評(píng)論 0 276
  • 序言:老撾萬榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎株扛,沒想到半個(gè)月后尤筐,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 46,200評(píng)論 1 319
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡洞就,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,282評(píng)論 3 340
  • 正文 我和宋清朗相戀三年盆繁,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片旬蟋。...
    茶點(diǎn)故事閱讀 40,424評(píng)論 1 352
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡油昂,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出倾贰,到底是詐尸還是另有隱情冕碟,我是刑警寧澤,帶...
    沈念sama閱讀 36,107評(píng)論 5 349
  • 正文 年R本政府宣布匆浙,位于F島的核電站安寺,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏首尼。R本人自食惡果不足惜挑庶,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,789評(píng)論 3 333
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望软能。 院中可真熱鬧迎捺,春花似錦、人聲如沸查排。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,264評(píng)論 0 23
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽跋核。三九已至岖瑰,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間了罪,已是汗流浹背锭环。 一陣腳步聲響...
    開封第一講書人閱讀 33,390評(píng)論 1 271
  • 我被黑心中介騙來泰國打工聪全, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留泊藕,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 48,798評(píng)論 3 376
  • 正文 我出身青樓,卻偏偏與公主長得像娃圆,于是被迫代替她去往敵國和親玫锋。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,435評(píng)論 2 359

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