(iOS - Objective-C ) UIFont - 自定義字體的兩種姿勢

2018.9.19

參考:iOS使用自定義字體的方法(內(nèi)置和任意下載ttf\otf\ttc字體文件)
沒辦法,就是喜歡宏定義,簡單粗暴,居家必備之良品
#define CXFont(fontSize) [UIFont systemFontOfSize:fontSize]  ///最最普通的系統(tǒng)默認字體
#define CXFont_bold(fontSize) [UIFont boldSystemFontOfSize:fontSize]  ///最最普通的系統(tǒng)默認加粗字體
#define CXFont_hylxj(fontSize) [UIFont fontWithName:@"HYLingXinJ" size:fontSize]  ///額,這個是我導(dǎo)入的一個自定義字體《漢儀菱心體-簡》


自定義字體的第一種姿勢

把字體庫文件HYLingXinJ.ttf添加到工程,然后在工程的Info.plist文件中添加一項內(nèi)容Fonts provided by application,這是個數(shù)組,然后添加key item0,value就是剛才導(dǎo)入的字體文件名全稱HYLingXinJ.ttf,這是個字符串;好吧,還是上圖最直接了;

自定義字體.png

需要注意的是,這個字體文件本來的文件名不是這個,可能是123.ttf,這不重要,我強迫癥,在代碼里獲取到真正的文件名之后,我給它替換成真正的字體名了。。。,如果沒有強迫癥的話,那在info.plist文件中填入的便是123.ttf;但是調(diào)用的時候,一定要用這個導(dǎo)入字體的真正的字體名,嗯,如我開頭的那個宏定義那樣;
那拿到字體文件后,我特么要怎么知道這個文件的真正字體名呢,就是那個什么fontName??嗯,來copy一下下面的這段代碼,跑一遍就知道了;

+ (NSArray *)CXGetAllFontNames {
    NSArray *familyNames = [[NSArray alloc] initWithArray:[UIFont familyNames]];
    NSMutableArray *allFontNames = [NSMutableArray array];
    NSArray *fontNames;
    NSInteger indFamily, indFont;

    //NSLog(@"familyNames.count=%ld", familyNames.count);
    for(indFamily = 0; indFamily < familyNames.count; indFamily++) {
        [allFontNames addObject:[NSString stringWithFormat:@"Family name: %@", [familyNames objectAtIndex:indFamily]]];
        fontNames = [[NSArray alloc] initWithArray:[UIFont fontNamesForFamilyName:[familyNames objectAtIndex:indFamily]]];
        for(indFont=0; indFont < fontNames.count; indFont++) {
            [allFontNames addObject:[NSString stringWithFormat:@"  Font name: %@", [fontNames objectAtIndex:indFont]]];
        }
    }
    return [allFontNames copy];
}  ///建議將這個方法寫到UIFont的分類中,另外,你還可以通過這個方法,用UITableView一次性顯示出所有的系統(tǒng)字體,然后,嗯,你想寵幸哪個字體,就隨便你了,雖然沒有佳麗三千,不過,也有小三百斯巴達了。。。我在說些什么鬼

拿到數(shù)組之后,嗯,需要你睜大眼睛好好找一下了,摔~;最后,直接用開頭的那個宏定義就可以自由使用個自定義字體了;不過,當(dāng)你看了下面種姿勢之后,其實可以用下面這種姿勢的第一個方法來精準(zhǔn)獲取到準(zhǔn)確的字體名,100%的fontName??;


自定義字體的第二種姿勢

這個姿勢不需要在info.plist文件中設(shè)定任何東西,但是同樣需要先將字體文件添加進工程,然后就只需要用到字體庫文件的路徑,調(diào)用一個方法就可以自由使用自定義字體了;
直接上代碼

/**
 獲取導(dǎo)入的自定義字體的名稱
 并注冊自定義字體到系統(tǒng)字體庫,在程序啟動后調(diào)用一次即可
 適用字體類型:ttf,otf

 @param path 字體文件存放路徑,
 @return 自定義字體的名稱
 */
+ (NSString *)CXGetCustomFontNameWithPath:(NSString *)path {
    NSURL *fontUrl = [NSURL fileURLWithPath:path];
    CGDataProviderRef fontDataProvider = CGDataProviderCreateWithURL((__bridge CFURLRef)fontUrl);
    CGFontRef fontRef = CGFontCreateWithDataProvider(fontDataProvider);
    CGDataProviderRelease(fontDataProvider);
    CTFontManagerRegisterGraphicsFont(fontRef, NULL);
    NSString *fontName = CFBridgingRelease(CGFontCopyPostScriptName(fontRef));
    CGFontRelease(fontRef);
    return fontName;
}

/**
 獲取導(dǎo)入的自定義字體的名稱數(shù)組
 并注冊自定義字體到系統(tǒng)字體庫,在程序啟動后調(diào)用一次即可
 適用字體類型:ttc

 @param path 字體文件存放路徑
 @return 自定義字體的名稱數(shù)組
    */
+ (NSArray *)CXGetCustomFontNameArrayWithPath:(NSString *)path {
    CFStringRef fontPath = CFStringCreateWithCString(NULL, [path UTF8String], kCFStringEncodingUTF8);
    CFURLRef fontUrl = CFURLCreateWithFileSystemPath(NULL, fontPath, kCFURLPOSIXPathStyle, 0);
    CFArrayRef fontArray =CTFontManagerCreateFontDescriptorsFromURL(fontUrl);
    CTFontManagerRegisterFontsForURL(fontUrl, kCTFontManagerScopeNone, NULL);
    NSMutableArray *customFontArray = [NSMutableArray array];
    for (CFIndex i = 0 ; i < CFArrayGetCount(fontArray); i++){
        CTFontDescriptorRef  descriptor = CFArrayGetValueAtIndex(fontArray, i);
        CTFontRef fontRef = CTFontCreateWithFontDescriptor(descriptor, 15, NULL);
        NSString *fontName = CFBridgingRelease(CTFontCopyName(fontRef, kCTFontPostScriptNameKey));
        [customFontArray addObject:fontName];
    }

    return customFontArray;
}

在調(diào)試時得知具體字體名之后,同樣建議寫一個宏定義來方便自己隨時隨地的調(diào)用;


附:(字體的介紹)

TTF(TrueTypeFont)是一種字庫名稱。TTF(TrueTypeFont)是Apple公司和Microsoft公司共同推出的字體文件格式,隨著windows的流行,已經(jīng)變成最常用的一種字體文件表示方式。
TTC字體是TrueType字體集成文件(. TTC文件),是在一單獨文件結(jié)構(gòu)中包含多種字體,以便更有效地共享輪廓數(shù)據(jù),當(dāng)多種字體共享同一筆畫時,TTC技術(shù)可有效地減小字體文件的大小。
TTC是幾個TTF合成的字庫,安裝后字體列表中會看到兩個以上的字體。兩個字體中大部分字都一樣時,可以將兩種字體做成一個TTC文件,常見的TTC字體,因為共享筆劃數(shù)據(jù),所以大多這個集合中的字體區(qū)別只是字符寬度不一樣,以便適應(yīng)不同的版面排版要求。
而TTF字體則只包含一種字型。

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

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

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