iOS修改字體

一、目的
有些公司在項(xiàng)目開(kāi)發(fā)中,可能應(yīng)用自己定義的字體樣式,這樣就涉及了字體設(shè)置的方法了,今天在這里用代碼簡(jiǎn)單演示一下,以備不時(shí)之需。
二、準(zhǔn)備
新建一個(gè)工程ChangeFont,然后將一個(gè)DS-DIGII.TTF的字體庫(kù)拖工程中,里面的工程目錄大概就是這樣的:

目錄.png

接下來(lái)我們可以在ViewController類中創(chuàng)建一個(gè)UILabel來(lái)顯示字體樣式:

UILabel *label = [[UILabel alloc] init];
label.frame = CGRectMake(100, 100, 160, 50);
label.backgroundColor = [UIColor yellowColor];
label.textAlignment = NSTextAlignmentCenter;
label.text = @"9876543210";
[self.view addSubview:label];

運(yùn)行結(jié)果:


運(yùn)行結(jié)果.png

三、改變字體
之前已經(jīng)把DS-DIGII.TTF這個(gè)文件拖進(jìn)去了,現(xiàn)在在plist文件里面配置一下。打開(kāi)plist然后加入名為Fonts provided by application的一行,在item里把字體名字加進(jìn)去。(ps:帶后綴)

配置.png

在代碼中更改字體,如下:
(ps:字體文件名稱不代表字體名稱,所以不能直接在代碼中寫DS-DIGII.TTF文件名)

首先需要找出字體名稱,遍歷一下:

for(NSString *familyName in [UIFont familyNames]){
        NSLog(@"Font FamilyName = %@",familyName); // 輸出字體族科名字
        for(NSString *fontName in [UIFont fontNamesForFamilyName:familyName]) {
            NSLog(@"\t%@",fontName); // 輸出字體族科下字樣名字
        }
    }

最后找出了相對(duì)于沒(méi)有添加這個(gè)字體的工程多出的字體就是本次添加的字體了
結(jié)果:
// Font FamilyName = DS-Digital
// 2017-05-07 13:31:44.639 ChangeFont[9315:66825327]    DS-Digital-Italic

換個(gè)姿勢(shì):
據(jù)說(shuō),在 Finder 里面找到這個(gè)TTF,雙擊打開(kāi),也能看到這個(gè)字體名稱:


換個(gè)姿勢(shì).png

接下來(lái)測(cè)試:

UILabel *label = [[UILabel alloc] init];
label.frame = CGRectMake(100, 100, 160, 50);
label.backgroundColor = [UIColor yellowColor];
label.textAlignment = NSTextAlignmentCenter;
label.text = @"9876543210";
label.font = [UIFont fontWithName:@"DS-Digital" size:16.0f];
[self.view addSubview:label];
好了.png

OK!效果改變字體在這里就簡(jiǎn)單的實(shí)現(xiàn)了。

四、深思
有沒(méi)有感覺(jué)上面的方法很lou,控件多了就吐血了,其實(shí)可以利用runtime的class_addMethod、class_replaceMethod、method_exchangeImplementations這幾個(gè)方法實(shí)現(xiàn),代碼如下:

class_getInstanceMethod得到類的實(shí)例方法
class_getClassMethod得到類的類方法

#import <UIKit/UIKit.h>

@interface UILabel (FontChange)

@end
#import "UILabel+FontChange.h"
#import <objc/runtime.h>

#define CustomFontName @"DS-Digital"
@implementation UILabel (FontChange)

+ (void)load {
    // load方法只會(huì)走一次,這里這里的執(zhí)行一次加不加都可以。提高容錯(cuò)率
    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) {
            // 如果成功,說(shuō)明類中不存在這個(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];
    // 不改變button的title字體設(shè)置的,在這里你可以判斷那種類型的改哪種不改,比如說(shuō)你不想改button的字體,把這一句解注釋即可
    // if ([self isKindOfClass:NSClassFromString(@"UIButtonLabel")]) {
    //     return;
    // }
    if (self) {
        if (self.tag == 000000) {
            self.font = [UIFont systemFontOfSize:self.font.pointSize];
        } else {
            if ([UIFont fontNamesForFamilyName:CustomFontName])
                self.font  = [UIFont fontWithName:CustomFontName size:self.font.pointSize];
        }
    }
}

@end
然后不加任何代碼如下:
UILabel *label = [[UILabel alloc] init];
label.frame = CGRectMake(100, 100, 160, 50);
label.backgroundColor = [UIColor yellowColor];
label.textAlignment = NSTextAlignmentCenter;
label.text = @"9876543210";
// label.tag = 000000;
// label.font = [UIFont fontWithName:@"DS-Digital" size:16.0f];
[self.view addSubview:label];
這樣就可以實(shí)現(xiàn)了

------整理

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • Android 自定義View的各種姿勢(shì)1 Activity的顯示之ViewRootImpl詳解 Activity...
    passiontim閱讀 179,063評(píng)論 25 709
  • Spring Cloud為開(kāi)發(fā)人員提供了快速構(gòu)建分布式系統(tǒng)中一些常見(jiàn)模式的工具(例如配置管理,服務(wù)發(fā)現(xiàn),斷路器,智...
    卡卡羅2017閱讀 136,569評(píng)論 19 139
  • 1. Java基礎(chǔ)部分 基礎(chǔ)部分的順序:基本語(yǔ)法,類相關(guān)的語(yǔ)法,內(nèi)部類的語(yǔ)法,繼承相關(guān)的語(yǔ)法,異常的語(yǔ)法,線程的語(yǔ)...
    子非魚_t_閱讀 34,728評(píng)論 18 399
  • 關(guān)注互聯(lián)網(wǎng),關(guān)注硅谷堂。想了解更多關(guān)于互聯(lián)網(wǎng)崗位知識(shí)的信息,關(guān)注微信公眾號(hào):硅谷堂(ID:guigutang)或下...
    硅谷堂閱讀 489評(píng)論 0 1
  • 前言: React 起源于 Facebook 的內(nèi)部項(xiàng)目,因?yàn)樵摴緦?duì)市場(chǎng)上所有 JavaScript MVC 框...
    Binaryify閱讀 3,189評(píng)論 0 3

友情鏈接更多精彩內(nèi)容