iOS字型載入三種方式,ios字型三種方式
- 靜態載入
- 動態載入
- 動態下載蘋果提供的多種字型
- 其他
這是一篇很簡短的文章,介紹了 iOS 自訂字型載入的三種方式。
靜態載入
這個可以說是最簡單最直觀的一種載入自訂字型的方式。只要字型包含到工程中,然後修改工程的 plist 檔案,添加 Fonts provided by application 欄位,並把要添加的字型檔名寫入這個數組。
之後直接使用即可
- (void)staticLoad{ self.staticFontLabel.font = [UIFont fontWithName:@"MFYingHua_Noncommercial-Regular" size:50];}
動態載入
有時我們不希望把字型包含到 bundle 中靜態載入,比如字型供應商對字型進行了加密,需要在程式運行時解密。又或者希望能通過後端控制 App 的顯示字型。那麼我們就需要動態載入字型。
- (void)dynamicLoad{ //字型檔所在路徑 NSString *URL_FONT = @"http://192.168.1.12:8888/static/MFDingDing.otf"; //字型名 NSString *fontName = @"MFDingDing_Noncommercial-Regular"; //下載字型 NSData *dynamicFontData = [NSData dataWithContentsOfURL:[NSURL URLWithString:URL_FONT]]; if (!dynamicFontData) return; CFErrorRef error; CGDataProviderRef providerRef = CGDataProviderCreateWithCFData((CFDataRef)dynamicFontData); CGFontRef font = CGFontCreateWithDataProvider(providerRef); if (! CTFontManagerRegisterGraphicsFont(font, &error)) { //如果註冊失敗,則不使用 CFStringRef errorDescription = CFErrorCopyDescription(error); NSLog(@"Failed to load font: %@", errorDescription); CFRelease(errorDescription); } else self.dynamicFontLabel.font = [UIFont fontWithName:fontName size:50]; CFRelease(font); CFRelease(providerRef);}
注意,你需要添加 CoreText.framework 並包含標頭檔 #import <CoreText/CoreText.h>。
動態下載蘋果提供的多種字型
從 iOS 6 開始,蘋果提供了一個新的 API 可以讓我們動態下載蘋果提供的額外字型。並且,這些字型是下載到系統中,也就是說,如果其他 App 也使用了這個字型或者 App 刪除後重裝時是無需再額外下載這個字型的。
字型列表
在這裡推薦一篇來自唐巧的博文:動態下載蘋果提供的多種中文字型,作者很詳細的介紹了這個功能。所以這裡就不再重複敘述了。
其他
最後提供倆小函數
列印出當前所有可用的字型
- (void)printAllFonts{ NSArray *fontFamilies = [UIFont familyNames]; for (NSString *fontFamily in fontFamilies) { NSArray *fontNames = [UIFont fontNamesForFamilyName:fontFamily]; NSLog (@"%@: %@", fontFamily, fontNames); }}
檢查某字型是否已經下載
- (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;}