切換APP字號

修改字體.jpg

  一個APP開發(fā)都尾聲時候烙博,老板一句說這字體好小,做一個切換字體的功能吧烟逊!例如QQ微信那樣的渣窜。我當(dāng)時就想這應(yīng)該是用個全局宏定義,就可以吧宪躯!最后發(fā)現(xiàn)乔宿,我的工程項目是用storyboard來創(chuàng)建的,所以沒有例如手寫代碼有一個宏定義的字體定義访雪。全工程都由Xib創(chuàng)建详瑞,IB上修改和設(shè)置字體。瞬間懵逼了臣缀。

不過如果使用宏定義坝橡,我猜想也是不可以的,因為你修改了宏精置,頁面的字體也不會因為宏的改變而去變化计寇。修改了宏并不會去觸發(fā)頁面刷新,需要用全局定義宏,可能需要一個觸發(fā)頁面刷新的方法番宁。也就需要用到通知或者別的元莫。

runTime控制字體

我在網(wǎng)上百度了許久,也去翻墻使用google來搜索一些外文網(wǎng)頁蝶押。只有看到一些類似的踱蠢,主題更換資料。有一個博主有寫了一個方法棋电,使用runTime(運行時)來控制APP程序中的字體變化朽基。寫一個UILabel的分類,在分類用使用+ (void)load { }使用class_getInstanceMethod(Class cls, SEL name)方法獲取自定義方法和系統(tǒng)方法离陶,在使用method_exchangeImplementations(Method m1, Method m2)方法替換系統(tǒng)的方法稼虎。
以下是這方法的代碼:

+ (void)load {
    Method imp = class_getInstanceMethod([self class], @selector(initWithCoder:));
    Method myImp = class_getInstanceMethod([self class], @selector(myInitWithCoder:));
    method_exchangeImplementations(imp, myImp);
}

- (id)myInitWithCoder:(NSCoder*)aDecode {
    [self myInitWithCoder:aDecode];
    if (self) {
        //使用UD獲取本地保存的字體大小
        NSUserDefaults *userDefault = [NSUserDefaults standardUserDefaults];
        NSNumber *num = [userDefault objectForKey:@"Font"];
        CGFloat fontSize = self.font.pointSize;
        self.font = [UIFont systemFontOfSize:fontSize + [num floatValue]];
    }
    return self;
}

只要寫好這個分類,只需要丟入工程內(nèi)就可以直接實現(xiàn)APP的字體變化招刨,方便快捷霎俩。不過這方法有個弊端,就是修改字體后沉眶,需要重新啟動APP打却,才能實現(xiàn)。本人對于APP的內(nèi)存管理知識不是很全面谎倔,大概理解是當(dāng)APP頁面將要出現(xiàn)的時候都會運行+ (void)load { }方法柳击,不過當(dāng)頁面已經(jīng)出現(xiàn)內(nèi)存已經(jīng)存在時候就不會運行+ (void)load { }方法(也可以自己去百度下這方法)如果有大神懂這里面的原由,可以方便告知我下片习。

控制器基類-遍歷

之后我使用基類UIViewController 讓每個基于控制器頁面都繼承于這個類捌肴,就是所謂的基類。然后再這基類中接收一個通知KVO藕咏,觸發(fā)方法來循環(huán)遍歷頁面中所有view.subviews判斷是否為UIButton和UILabel状知。以下為代碼:

@interface BaseViewController ()

@end

@implementation BaseViewController

- (void)viewDidLoad {
    [super viewDidLoad];
    
    [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(tongzhi:) name:@"tongzhi" object:nil];
}

- (void)tongzhi:(NSNotification *)text{
    NSLog(@"%@",text.userInfo[@"font"]);
    NSLog(@"-----接收到通知------");
    NSNumber *num = text.userInfo[@"font"];
    [self setFont:[num floatValue] forView:self.view];
}

- (void)setFont:(CGFloat)fontSize forView:(UIView*)view{
    if ([view isKindOfClass:[UILabel class]]) {
        UILabel *lbl = (UILabel *)view;
        CGFloat font = lbl.font.pointSize;
        lbl.font = [UIFont systemFontOfSize:font + fontSize];
    }
    if ([view isKindOfClass:[UIButton class]]) {
        UIButton *btn = (UIButton *)view;
        CGFloat font = btn.titleLabel.font.pointSize;
        btn.titleLabel.font = [UIFont systemFontOfSize:font + fontSize];
    }
    
    for (UIView *sview in view.subviews) {
        [self setFont:fontSize forView:sview];
    }
}

- (void)dealloc {
   [[NSNotificationCenter defaultCenter] removeObserver:self name:@"tongzhi" object:nil];
}

此方法可以實現(xiàn)字體的改變,不過略微復(fù)雜孽查,因為是每個子類都循環(huán)遍歷饥悴,可能會有系統(tǒng)運行速度過慢等問題。還有因為我的是工程全部使用 storyboard 來搭建的頁面盲再,其中我也使用了UITableViewController西设,雖然UITableViewController也是繼承于UIViewController,就可能需要使用多繼承答朋,Objective-C又不支持多繼承贷揽,需要用協(xié)議來實現(xiàn),感覺有些麻煩绿映,也許是因為本人知識不夠擒滑。所以沒有繼續(xù)下去

設(shè)計思路:控件基類-通知-基類獲取通知

第三種腐晾,也是我現(xiàn)在使用的一種。這種方法就比前面說的簡單丐一,并且不會出現(xiàn)問題藻糖。這是求教了我以前的老大,也根據(jù)網(wǎng)上一些類似的功能库车,主題切換巨柒,來實現(xiàn)的。
首先柠衍,我創(chuàng)建一個繼承于UILabel的基類洋满,在這基類中添加通知KVO,監(jiān)聽字體珍坊。
核心代碼:

@interface BaseLabel ()

@property (assign, nonatomic) CGFloat fontSize;

@end

@implementation BaseLabel

- (id)init {
    self = [super init];
    if (self != nil) {
        NSLog(@"我出現(xiàn)了 init ");
    }
    return self;
}

- (instancetype)initWithCoder:(NSCoder *)aDecoder {
    self = [super initWithCoder:aDecoder];
    if (self != nil) {
        NSLog(@"我出現(xiàn)了 initWithCoder");
    }
    return self;
}

- (void)awakeFromNib {
    [super awakeFromNib];
    NSUserDefaults *userDefault = [NSUserDefaults standardUserDefaults];
    NSNumber *num = [userDefault objectForKey:@"Font"];
    CGFloat font = self.font.pointSize;
    self.font = [UIFont systemFontOfSize:font + [num floatValue]];
     
    self.fontSize = font; 
    [[NSNotificationCenter defaultCenter]  addObserver:self selector:@selector(fontNotification:) name:@"tongzhi" object:nil]; 
    NSLog(@"我出現(xiàn)了 awakeFromNib   %f",self.fontSize);
}

#pragma mark - NSNotification Actions
- (void)fontNotification:(NSNotification *)notification {
    NSUserDefaults *userDefault = [NSUserDefaults standardUserDefaults];
    NSNumber *num = [userDefault objectForKey:@"Font"]; 
    self.font = [UIFont systemFontOfSize:self.fontSize + [num floatValue]];
}

#pragma mark - Memery Manager
- (void)dealloc {
    [[NSNotificationCenter defaultCenter] removeObserver:self name:@"tongzhi" object:nil];
}

只需要將工程中的UILabel基于此類就可以牺勾,直接實現(xiàn)字體的變化。使用一些空間約束來調(diào)整因為字體變化的原因而照成的控件變化問題阵漏。(例如tableViewCell高度的變化驻民,需要重新計算÷那樱可以直接使用Label的基類中的通知放到控制器上回还,來監(jiān)聽變化,實現(xiàn)cell高度的動態(tài)變化)

UIButton也可以使用此方法來控制字體的變化叹洲。

最后注意一點柠硕,我們修改APP字體的時候,我們需要保存在標(biāo)準(zhǔn)字號和修改后字體之間的差值运提,我設(shè)置了一個標(biāo)準(zhǔn)字號14蝗柔,因為APP中有這不同的Label字體。

這是工程在GitHub上的地址:changeLabelFont

大神請輕虐0_0!!!
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末糙捺,一起剝皮案震驚了整個濱河市诫咱,隨后出現(xiàn)的幾起案子笙隙,更是在濱河造成了極大的恐慌洪灯,老刑警劉巖,帶你破解...
    沈念sama閱讀 218,284評論 6 506
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件竟痰,死亡現(xiàn)場離奇詭異签钩,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)坏快,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,115評論 3 395
  • 文/潘曉璐 我一進(jìn)店門铅檩,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人莽鸿,你說我怎么就攤上這事昧旨∈案” “怎么了?”我有些...
    開封第一講書人閱讀 164,614評論 0 354
  • 文/不壞的土叔 我叫張陵兔沃,是天一觀的道長蒋得。 經(jīng)常有香客問我,道長乒疏,這世上最難降的妖魔是什么额衙? 我笑而不...
    開封第一講書人閱讀 58,671評論 1 293
  • 正文 為了忘掉前任,我火速辦了婚禮怕吴,結(jié)果婚禮上窍侧,老公的妹妹穿的比我還像新娘。我一直安慰自己转绷,他們只是感情好伟件,可當(dāng)我...
    茶點故事閱讀 67,699評論 6 392
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著议经,像睡著了一般锋爪。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上爸业,一...
    開封第一講書人閱讀 51,562評論 1 305
  • 那天其骄,我揣著相機(jī)與錄音,去河邊找鬼扯旷。 笑死拯爽,一個胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的钧忽。 我是一名探鬼主播毯炮,決...
    沈念sama閱讀 40,309評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼耸黑!你這毒婦竟也來了桃煎?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,223評論 0 276
  • 序言:老撾萬榮一對情侶失蹤大刊,失蹤者是張志新(化名)和其女友劉穎为迈,沒想到半個月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體缺菌,經(jīng)...
    沈念sama閱讀 45,668評論 1 314
  • 正文 獨居荒郊野嶺守林人離奇死亡葫辐,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,859評論 3 336
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了伴郁。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片耿战。...
    茶點故事閱讀 39,981評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖焊傅,靈堂內(nèi)的尸體忽然破棺而出剂陡,到底是詐尸還是另有隱情狈涮,我是刑警寧澤,帶...
    沈念sama閱讀 35,705評論 5 347
  • 正文 年R本政府宣布鸭栖,位于F島的核電站薯嗤,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏纤泵。R本人自食惡果不足惜骆姐,卻給世界環(huán)境...
    茶點故事閱讀 41,310評論 3 330
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望捏题。 院中可真熱鬧玻褪,春花似錦、人聲如沸公荧。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,904評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽循狰。三九已至窟社,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間绪钥,已是汗流浹背灿里。 一陣腳步聲響...
    開封第一講書人閱讀 33,023評論 1 270
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點兒被人妖公主榨干…… 1. 我叫王不留程腹,地道東北人匣吊。 一個月前我還...
    沈念sama閱讀 48,146評論 3 370
  • 正文 我出身青樓,卻偏偏與公主長得像寸潦,于是被迫代替她去往敵國和親色鸳。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 44,933評論 2 355

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

  • Android 自定義View的各種姿勢1 Activity的顯示之ViewRootImpl詳解 Activity...
    passiontim閱讀 172,139評論 25 707
  • 發(fā)現(xiàn) 關(guān)注 消息 iOS 第三方庫见转、插件命雀、知名博客總結(jié) 作者大灰狼的小綿羊哥哥關(guān)注 2017.06.26 09:4...
    肇東周閱讀 12,103評論 4 62
  • 每天都很嘈雜, 不是不可開交斩箫,就是渾渾噩噩吏砂。抽空拿出筆來,較喜歡的建筑畫在紙上校焦,算是將一天的心情收分在此赊抖。今天再見...
    濱海泛舟2013閱讀 218評論 0 3
  • 每個人心中都有屬于自己的王瀝川,看完《瀝川往事》寨典,心中只有一個念頭就是遇見王瀝川,再見王瀝川房匆,吻別王瀝川耸成,就像...
    蘇夏suxia閱讀 252評論 0 0
  • 老師报亩,作業(yè)我把對對子重新修改了下! 為奴十二載井氢,侍君三二事弦追。 這個殺手不太冷,一壺濁酒已深暖花竞。 彗星來的那一夜劲件,臘...
    潛水的魚兒閱讀 252評論 2 0