靜態載入 動態載入 動態下載蘋果提供的多種字體 其他 列印出當前所有可用的字體 檢查某字體是否已經下載 這是一篇很簡短的文章,介紹了 iOS 自定義字體載入的三種方式。 靜態載入 這個可以說是最簡單最直觀的一種載入自定義字體的方式。只要字體包含到工程中,然後修改工程的 plist 文件,添加 Fon ...
這是一篇很簡短的文章,介紹了 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;
}