標籤:
從本地讀取字型 並註冊
讀取方法一 :
+ (instancetype)customFont:(CGFloat)fontSize{ NSString *fontPath = [[NSBundle mainBundle]pathForResource:@"regular" ofType:@"otf"]; NSData *dynamicFontData = [NSData dataWithContentsOfFile:fontPath]; if (!dynamicFontData){ return [self customFont:fontSize];//系統內建字型 } CFErrorRef error; CGDataProviderRef providerRef = CGDataProviderCreateWithCFData((__bridge CFDataRef)dynamicFontData); CGFontRef newFont = CGFontCreateWithDataProvider(providerRef); CFStringRef fontName = CGFontCopyFullName(newFont); NSString *fontNameString = (__bridge id)(fontName); if ( ![self isResisted:fontNameString] && ! CTFontManagerRegisterGraphicsFont(newFont, &error)){ //註冊失敗 CFStringRef errorDescription = CFErrorCopyDescription(error); DDLog(@"自訂字型註冊失敗: %@", errorDescription); CFRelease(errorDescription); } CFRelease(newFont); CFRelease(providerRef); CFRelease(fontName); UIFont *fone = [UIFont fontWithName:fontNameString size:fontSize]; if (!fone){ fone = [self customFont:fontSize];//系統內建字型 } return fone;}
讀取方法二 (參考http://www.xuebuyuan.com/2189874.html) :
NSString *fontPath = [[NSBundle mainBundle] pathForResource:fontFileNameArray[i] ofType:nil]; NSURL *url = [NSURL fileURLWithPath:fontPath]; CGDataProviderRef fontDataProvider = CGDataProviderCreateWithURL((__bridge CFURLRef)url); if (fontDataProvider == NULL) { break; } CGFontRef newFont = CGFontCreateWithDataProvider(fontDataProvider); CGDataProviderRelease(fontDataProvider); if (newFont == NULL) { break; } CFStringRef fontName = CGFontCopyFullName(newFont); NSString *fontNameString = (__bridge id)(fontName); if ([fontNameString isEqualToString:@"Yuppy SC Regular"]) { fontNameString = @"YuppySC-Regular"; } [fontNameMDic setObject:fontNameString forKey:fontFileNameArray[i]]; CFRelease(fontName); CGFontRelease(newFont);
讀取方法三(參考http://www.cnblogs.com/vicstudio/p/3961195.html):
-(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;}
以上三種方法可以讀取ttf,otf 格式字型,但是方法一、二發現有時會有讀取不到的情況,讀取不到的原因是fontNameString 擷取錯誤,方法一有時擷取到的fontNameString是Yuppy SC Regular 但是實際的fontNameString 是 YuppySC-Regular,方法二的缺點是要事Crowdsourced Security Testing道fontNameString。方法三還沒有發現讀取不到的情況。
方法一、二擷取字型名的方法是:CGFontCopyFullName 方法三取字型名的方法是CGFontCopyPostScriptName,方法一 二擷取的FullName,iOS用的是PostScriptName
TTC字型的讀取方法(見http://www.cnblogs.com/vicstudio/p/3961195.html):
-(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;}
以下內容摘自(http://www.cnblogs.com/vicstudio/p/3961195.html)
不過這個方法只支援7.0以上,暫時在7.0以下沒有找到方法。
個人看法,因為ttc裡面的字型都比較相似,所以其實使用一個也足以。
附:(字型的介紹)
TTF(TrueTypeFont)是一種字型檔名稱。TTF(TrueTypeFont)是Apple公司和Microsoft公司共同推出的字型檔格式,隨著windows的流行,已經變成最常用的一種字型檔表示方式。
TTC字型是TrueType字型整合檔案(. TTC檔案),是在一單獨檔案結構中包含多種字型,以便更有效地共用輪廓資料,當多種字型共用同一筆畫時,TTC技術可有效地減小字型檔的大小。TTC是幾個TTF合成的字型檔,安裝後字型列表中會看到兩個以上的字型。兩個字型中大部分字都一樣時,可以將兩種字型做成一個TTC檔案,常見的TTC字型,因為共用筆劃資料,所以大多這個集合中的字型區別只是字元寬度不一樣,以便適應不同的版面排版要求。 而TTF字型則只包含一種字型。
iOS自訂字型