IOS字体下载
結合書本與蘋果官方給的例子后,總結下下載的方法。
蘋果給我們提供了很多漂亮的字體,只是有些字體設備并沒有內置,需要我們去下載才行。
系統提供給我們的字體名我們可以通過mac系統提供的字體冊來查閱。
得到我們想要的字體后就可以在我們的設備上進行下載了。這里要說一下,設備字體下載后是所有應用都可以使用的,而且字體的目錄并不是我們APP的目錄,因此并不會增大我們應用所需的空間。
這里結合著蘋果官方所給例子來簡述一下(官方例子):
事例中給我們預定了幾種字體來讓我們下載
1 - (void)viewDidLoad 2 { 3 [super viewDidLoad]; 4 5 self.fontNames = [[NSArray alloc] initWithObjects: 6 @"STXingkai-SC-Light", 7 @"DFWaWaSC-W5", 8 @"FZLTXHK--GBK1-0", 9 @"STLibian-SC-Regular", 10 @"LiHeiPro", 11 @"HiraginoSansGB-W3", 12 nil]; 13 self.fontSamples = [[NSArray alloc] initWithObjects: 14 @"漢體書寫信息技術標準相", 15 @"容檔案下載使用界面簡單", 16 @"支援服務升級資訊專業制", 17 @"作創意空間快速無線上網", 18 @"兙兛兞兝兡兣嗧瓩糎", 19 @"㈠㈡㈢㈣㈤㈥㈦㈧㈨㈩", 20 nil]; 21 }然后在表示圖的didSelectedRowAtIndexPath委托中來調用驗證字體的方法
1 - (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath 2 { 3 [self asynchronouslySetFontName:_fontNames[indexPath.row]]; 4 5 // Dismiss the keyboard in the text view if it is currently displayed 6 if ([self.fTextView isFirstResponder]) 7 [self.fTextView resignFirstResponder]; 8 }重點來看asynchronouslySetFontName方法,首先先驗證是否存在該字體
UIFont* aFont = [UIFont fontWithName:fontName size:12.];// If the font is already downloadedif (aFont && ([aFont.fontName compare:fontName] == NSOrderedSame || [aFont.familyName compare:fontName] == NSOrderedSame)) {// Go ahead and display the sample text.NSUInteger sampleIndex = [_fontNames indexOfObject:fontName];_fTextView.text = [_fontSamples objectAtIndex:sampleIndex];_fTextView.font = [UIFont fontWithName:fontName size:24.];return;}如果不存在改字體,那么aFont將會返回nil不執行該判斷語句,如果存在就直接使用并返回。
接下來看看不存在時,是如何進行字體下載的:
1 // Create a dictionary with the font's PostScript name. 2 NSMutableDictionary *attrs = [NSMutableDictionary dictionaryWithObjectsAndKeys:fontName, kCTFontNameAttribute, nil]; 3 4 // Create a new font descriptor reference from the attributes dictionary. 5 CTFontDescriptorRef desc = CTFontDescriptorCreateWithAttributes((__bridge CFDictionaryRef)attrs); 6 7 NSMutableArray *descs = [NSMutableArray arrayWithCapacity:0]; 8 [descs addObject:(__bridge id)desc]; 9 CFRelease(desc); 10 11 __block BOOL errorDuringDownload = NO;首先配置我們需要下載字體的屬性,將fontName作為值kCTFontNameAttribute作為鍵放入字典中。
然后使用CTFontDescriptorCreateWithAttribute來創建一個字體描述器并將NSDictionary轉為CFDictionaryRef作為參數傳入。
將CTFontDescriptorRef放入數組中(同樣需要轉為對象)。
接下來需要調用
CTFontDescriptorMatchFontDescriptorsWithProgressHandler( (__bridge CFArrayRef)descs, NULL,? ^(CTFontDescriptorMatchingState state, CFDictionaryRef progressParameter)
來判斷是否已經匹配到了字體,第一個參數使我們的描述字體數組,第二個設為NULL,第三個參數為回調block。
block的state參數為當前匹配的狀態,progressParmeter為進度參數,其中也包含錯誤信息。
我們所用到的state有下面這些:
kCTFontDescriptorMatchingDidBegin? //開始匹配
kCTFontDescriptorMatchingDidFinish //匹配成功
kCTFontDescriptorMatchingWillBeginDownloading//字體開始下載
kCTFontDescriptorMatchingDidFinishDownloading//字體下載成功
kCTFontDescriptorMatchingDownloading //下載中
kCTFontDescriptorMatchingDidFailWithError //匹配失敗
這些狀態的回調順序為
kCTFontDescriptorMatchingDidBegin
kCTFontDescriptorMatchingWillBeginDownloading
kCTFontDescriptorMatchingDownloading(多次調用)
kCTFontDescriptorMatchingDidFinishDownloading
kCTFontDescriptorMatchingDidFinish
其中kCTFontDescriptorMatchingDownloading會多次調用,來方便我們更新下載的進度條。
沒接到一個回調狀態我們就可以進行相應的UI處理,可以使用block,也可以使用通知。
progressParmeter我們用到了兩個屬性
因為它是CFDictionaryRef,所以首先我們應該先把它轉為NSDictionary
當前下載進度的鍵為kCTFontDescriptorMatchingPercentage
錯誤對象的鍵為kCTFontDescriptorMatchingError
如果返回的狀態是kCTFontDescriptorMatchingDidFailWithError,那我們就可以通過kCTFontDescriptorMatchingError來得到錯誤日志了。
轉載于:https://www.cnblogs.com/madpanda/p/4279141.html
總結
- 上一篇: Birdwatching
- 下一篇: mysql修改主服务器地址,怎么修改my