前言
在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
准给。
然后就可以調(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è)置為該字體,效果如下:
下面就該功能簡(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ì)使用第三方字體的方法的介紹。