iOS 使用第三方字體

前言

在iOS的項(xiàng)目開發(fā)中經(jīng)常遇到需要使用一些自定義的字體文件,比如仿宋_GB2312、華康少女體等。之前我們?yōu)榱耸褂眠@些自定義的字體,在應(yīng)用的資源包中放入這些字體文件。因?yàn)樽煮w文件通常比較大,有的一個(gè)字庫(kù)就達(dá)到10M以上,這樣打包后的ipa文件的體積就可能會(huì)變得很大,對(duì)于只有個(gè)別的模塊需要特殊的字體樣式的應(yīng)用來(lái)說(shuō)很不劃算,那么在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可以遍歷打印出來(lái):

- (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è)指定路徑下的字體文件

下載回來(lái)的字體文件如果不做處理是不能直接使用的,使用前需要先注冊(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)被加載過(guò)了,判斷方式如下:

- (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;
}

  • 其他說(shuō)明

經(jīng)測(cè)試注冊(cè)過(guò)的字體在應(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)系作者
【社區(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)容

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

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