iOS 使用第三方字體

前言

在iOS的項(xiàng)目開發(fā)中經(jīng)常遇到需要使用一些自定義的字體文件验烧,比如仿宋_GB2312虐拓、華康少女體等沼沈。之前我們?yōu)榱耸褂眠@些自定義的字體,在應(yīng)用的資源包中放入這些字體文件嘱函。因?yàn)樽煮w文件通常比較大甘畅,有的一個(gè)字庫就達(dá)到10M以上,這樣打包后的ipa文件的體積就可能會(huì)變得很大往弓,對(duì)于只有個(gè)別的模塊需要特殊的字體樣式的應(yīng)用來說很不劃算疏唾,那么在iOS6.0以后蘋果就開放了動(dòng)態(tài)加載字體的權(quán)限。下面就iOS中使用字體的這兩種方式進(jìn)行介紹函似。

使用靜態(tài)字體

將字體文件拷貝到項(xiàng)目工程中槐脏,在Info.plist文件中添加Fonts provided by application的配置項(xiàng),其中每一個(gè)Item對(duì)應(yīng)的是字體文件的名稱缴淋,如huakangshaonv.ttf准给。

fontDemo ScreenShot.png

然后就可以調(diào)用+ (UIFont *)fontWithName:(NSString *)fontName size:(CGFloat)fontSize使用字體泄朴,如果不知道fontName可以遍歷打印出來:

- (void)allFont
{
    NSArray *fontFamilies = [UIFont familyNames];
    for (NSString *fontFamily in fontFamilies)
    {
        NSArray *fontNames = [UIFont fontNamesForFamilyName:fontFamily];
        NSLog (@">>> fontFamily : %@ , fontNames : %@", fontFamily, fontNames);
    }
}

使用動(dòng)態(tài)字體

在網(wǎng)易新聞iOS客戶端中可以使用自定義的字體重抖,對(duì)于未下載的字體可先下載然后安裝下次就能自動(dòng)設(shè)置為該字體,效果如下:

wangyiFont.png

下面就該功能簡(jiǎn)單介紹實(shí)現(xiàn)的步驟

  • 下載字體文件
- (NSString *)downloadZipFile:(NSString *)fileUrl toPath:(NSString *)path
{
    NSError *error = nil;
    NSURL *url = [NSURL URLWithString:fileUrl];
    NSString *fileName = [url lastPathComponent];
    NSData *data = [NSData dataWithContentsOfURL:url options:0 error:&error];
    if(!error)
    {
        NSString *zipPath = [path stringByAppendingPathComponent:fileName];
        [data writeToFile:zipPath options:0 error:&error];
        if(!error)
        {
            return zipPath;
        }
    }
    return nil;
}
  • 解壓zip壓縮包

iOS中解壓zip壓縮文件非常方便祖灰,使用ZipArchive這個(gè)開源項(xiàng)目按照如下的方式即可快速解壓zip文件钟沛。

- (NSString *)expandZipFile:(NSString *)src toPath:(NSString *)desc
{
    ZipArchive *za = [[ZipArchive alloc] init];
    if ([za UnzipOpenFile:src])
    {
        BOOL ret = [za UnzipFileTo:desc overWrite:YES];//解壓文件
        if(ret)
        {
            NSString *zipName = [src lastPathComponent];//獲取zip文件的文件名
            [[NSFileManager defaultManager] removeItemAtPath:zipPath error:nil];//刪除zip壓縮包
            zipName = [zipName substringToIndex:[zipName rangeOfString:@".zip"].location];//獲取解壓到的文件夾
            return [self.downloadPath stringByAppendingPathComponent:zipName];
        }
    }
    return nil;
}
  • 注冊(cè)指定路徑下的字體文件

下載回來的字體文件如果不做處理是不能直接使用的,使用前需要先注冊(cè)然后才能使用局扶,注冊(cè)方式如下:

- (void)registerFont:(NSString *)fontPath
{
    NSData *dynamicFontData = [NSData dataWithContentsOfFile:fontPath];
    if (!dynamicFontData)
    {
        return;
    }
    CFErrorRef error;
    CGDataProviderRef providerRef = CGDataProviderCreateWithCFData((__bridge CFDataRef)dynamicFontData);
    CGFontRef font = CGFontCreateWithDataProvider(providerRef);
    if (! CTFontManagerRegisterGraphicsFont(font, &error))
    {
        //注冊(cè)失敗
        CFStringRef errorDescription = CFErrorCopyDescription(error);
        NSLog(@"Failed to load font: %@", errorDescription);
        CFRelease(errorDescription);
    }
    CFRelease(font);
    CFRelease(providerRef);
}

需要先引入#import <CoreText/CoreText.h>恨统,CoreText框架

  • 判斷字體是否加載

在使用字體文件前最好是先判斷字體是否已經(jīng)被加載過了叁扫,判斷方式如下:

- (BOOL)isFontDownloaded:(NSString *)fontName
{
    UIFont* aFont = [UIFont fontWithName:fontName size:12.0];
    BOOL isDownloaded = (aFont && ([aFont.fontName compare:fontName] == NSOrderedSame || [aFont.familyName compare:fontName] == NSOrderedSame));
    return isDownloaded;
}

  • 其他說明

經(jīng)測(cè)試注冊(cè)過的字體在應(yīng)用關(guān)閉后下次開啟應(yīng)用,判斷字體是否加載時(shí)返回為NO畜埋,為了保證正常使用需要每次啟動(dòng)應(yīng)用的時(shí)候先遍歷一遍字體文件夾將里面的字體文件都再次注冊(cè)一遍即可莫绣。參考代碼如下:

//注冊(cè)fonts目錄下面的所有字體文件
NSArray *ary = [[NSFileManager defaultManager] contentsOfDirectoryAtPath:self.downloadPath error:nil];
for (NSString *p1 in ary)
{
    NSString *t1 = [self.downloadPath stringByAppendingPathComponent:p1];
    NSArray *ary1 = [[NSFileManager defaultManager] contentsOfDirectoryAtPath:t1 error:nil];
    for (NSString *p1 in ary1)
    {
        NSString *t2 = [t1 stringByAppendingPathComponent:p1];
        if([t2 rangeOfString:@".ttf"].location != NSNotFound)
        {
            [self registerFont:t2];
        }
    }
}

以上就是對(duì)使用第三方字體的方法的介紹。

參考

曾靜的技術(shù)博客在iOS開發(fā)中使用自定義字體

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末悠鞍,一起剝皮案震驚了整個(gè)濱河市对室,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌咖祭,老刑警劉巖掩宜,帶你破解...
    沈念sama閱讀 211,376評(píng)論 6 491
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異么翰,居然都是意外死亡牺汤,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,126評(píng)論 2 385
  • 文/潘曉璐 我一進(jìn)店門浩嫌,熙熙樓的掌柜王于貴愁眉苦臉地迎上來檐迟,“玉大人,你說我怎么就攤上這事固该」酰” “怎么了?”我有些...
    開封第一講書人閱讀 156,966評(píng)論 0 347
  • 文/不壞的土叔 我叫張陵伐坏,是天一觀的道長怔匣。 經(jīng)常有香客問我,道長桦沉,這世上最難降的妖魔是什么每瞒? 我笑而不...
    開封第一講書人閱讀 56,432評(píng)論 1 283
  • 正文 為了忘掉前任,我火速辦了婚禮纯露,結(jié)果婚禮上剿骨,老公的妹妹穿的比我還像新娘。我一直安慰自己埠褪,他們只是感情好浓利,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,519評(píng)論 6 385
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著钞速,像睡著了一般贷掖。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上渴语,一...
    開封第一講書人閱讀 49,792評(píng)論 1 290
  • 那天苹威,我揣著相機(jī)與錄音,去河邊找鬼驾凶。 笑死牙甫,一個(gè)胖子當(dāng)著我的面吹牛掷酗,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播窟哺,決...
    沈念sama閱讀 38,933評(píng)論 3 406
  • 文/蒼蘭香墨 我猛地睜開眼泻轰,長吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來了且轨?” 一聲冷哼從身側(cè)響起糕殉,我...
    開封第一講書人閱讀 37,701評(píng)論 0 266
  • 序言:老撾萬榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎殖告,沒想到半個(gè)月后阿蝶,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 44,143評(píng)論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡黄绩,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,488評(píng)論 2 327
  • 正文 我和宋清朗相戀三年羡洁,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片爽丹。...
    茶點(diǎn)故事閱讀 38,626評(píng)論 1 340
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡筑煮,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出粤蝎,到底是詐尸還是另有隱情真仲,我是刑警寧澤,帶...
    沈念sama閱讀 34,292評(píng)論 4 329
  • 正文 年R本政府宣布初澎,位于F島的核電站秸应,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏碑宴。R本人自食惡果不足惜软啼,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,896評(píng)論 3 313
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望延柠。 院中可真熱鬧祸挪,春花似錦、人聲如沸贞间。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,742評(píng)論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽增热。三九已至整以,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間钓葫,已是汗流浹背悄蕾。 一陣腳步聲響...
    開封第一講書人閱讀 31,977評(píng)論 1 265
  • 我被黑心中介騙來泰國打工票顾, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留础浮,地道東北人帆调。 一個(gè)月前我還...
    沈念sama閱讀 46,324評(píng)論 2 360
  • 正文 我出身青樓,卻偏偏與公主長得像豆同,于是被迫代替她去往敵國和親番刊。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,494評(píng)論 2 348

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

  • 發(fā)現(xiàn) 關(guān)注 消息 iOS 第三方庫影锈、插件芹务、知名博客總結(jié) 作者大灰狼的小綿羊哥哥關(guān)注 2017.06.26 09:4...
    肇東周閱讀 12,059評(píng)論 4 62
  • 最近事情比較多,也很雜鸭廷,還帶有一點(diǎn)點(diǎn)驚心動(dòng)魄枣抱。一直沒記錄,是沒時(shí)間辆床,也是因?yàn)槎即嬗写罅孔償?shù)佳晶。 無錫。 媽媽和繼父回...
    武允兒閱讀 169評(píng)論 0 0
  • 一直都不是很喜歡自己這樣的性子 敏感著 對(duì)任何小事都觀察入微 是不是太過于早熟了 明白著那么這個(gè)年齡本不該去...
    暖心sun閱讀 191評(píng)論 1 2
  • 很多人問我為什么叫我的死黨L小姐稱師父讼载,這是因?yàn)槲腋咧心且荒甑捏w育課成績(jī)極差轿秧,除了仰臥起坐之外我什么都不擅長,為了...
    達(dá)達(dá)令閱讀 903評(píng)論 0 5
  • 倉央嘉措的一生是個(gè)難以捉摸的謎咨堤,也是一個(gè)永恒不朽的傳奇菇篡。這個(gè)謎一樣的男子,是一個(gè)詩人一喘,也是一個(gè)僧人驱还。他的詩寫盡了凡...
    xueshuai閱讀 786評(píng)論 9 13