|
最近做了個(gè)有關(guān)閱讀的應(yīng)用,使用了自定義字體,學(xué)習(xí)了一下這方面的知識(shí)。 1.首先是最簡(jiǎn)單也普遍的做法,打包內(nèi)置字符庫文件: 把字體庫文件添加到工程,如font1.ttf添加到工程,然后在工程plist添加一項(xiàng)Fonts provided by application,這是個(gè)數(shù)組,然后添加key item1,value就是剛才說的font1.ttf,如圖:
那么在工程里就可以直接使用這個(gè)字體,直接用 + (UIFont *)fontWithName:(NSString *)fontName size:(CGFloat)fontSize; 即可。 不過需要注意的是,這個(gè)fontName不是文件名,而是里面真正的字體名。如上面的font1.ttf里面的字體是MFQingShu_Noncommercial-Regular,那就直接用 UIFont *font = [UIFont fontWithName:@"MFQingShu_Noncommercial-Regular" size:12];就能去到正確的字體。
2.但是一般來說,字體文件比較大,不該內(nèi)置,而且如果都用plist預(yù)定義的方式,那肯定就沒法覆蓋全,導(dǎo)致用戶不能使用更多自己喜歡的字體。所以應(yīng)該用代碼讀取字體的方式: 提供字體文件路徑,返回所需要字體: -(UIFont*)customFontWithPath:(NSString*)path size:(CGFloat)size
{
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));
UIFont *font = [UIFont fontWithName:fontName size:size];
CGFontRelease(fontRef);
return font;
}
這樣就不需要在plist設(shè)定任何東西,只需要得到字體庫文件的路徑,就可以取出對(duì)應(yīng)的字體。 上面的方法對(duì)于TTF、OTF的字體都有效,但是對(duì)于TTC字體,只取出了一種字體。因?yàn)門TC字體是一個(gè)相似字體的集合體,一般是字體的組合。所以如果對(duì)字體要求比較高,所以可以用下面的方法把所有字體取出來: -(NSArray*)customFontArrayWithPath:(NSString*)path size:(CGFloat)size
{
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, size, NULL);
NSString *fontName = CFBridgingRelease(CTFontCopyName(fontRef, kCTFontPostScriptNameKey));
UIFont *font = [UIFont fontWithName:fontName size:size];
[customFontArray addObject:font];
}
return customFontArray;
}
不過這個(gè)方法只支持7.0以上,暫時(shí)在7.0以下沒有找到方法。 個(gè)人看法,因?yàn)閠tc里面的字體都比較相似,所以其實(shí)使用一個(gè)也足以。
附:(字體的介紹) TTF(TrueTypeFont)是一種字庫名稱。TTF(TrueTypeFont)是Apple公司和Microsoft公司共同推出的字體文件格式,隨著windows的流行,已經(jīng)變成最常用的一種字體文件表示方式。 TTC字體是TrueType字體集成文件(. TTC文件),是在一單獨(dú)文件結(jié)構(gòu)中包含多種字體,以便更有效地共享輪廓數(shù)據(jù),當(dāng)多種字體共享同一筆畫時(shí),TTC技術(shù)可有效地減小字體文件的大小。
TTC是幾個(gè)TTF合成的字庫,安裝后字體列表中會(huì)看到兩個(gè)以上的字體。兩個(gè)字體中大部分字都一樣時(shí),可以將兩種字體做成一個(gè)TTC文件,常見的TTC字體,因?yàn)楣蚕砉P劃數(shù)據(jù),所以大多這個(gè)集合中的字體區(qū)別只是字符寬度不一樣,以便適應(yīng)不同的版面排版要求。
而TTF字體則只包含一種字型。
|
|
|