iOS 7: 隱藏的特性和解決之道
這里顯示了你該如何獲取一個用CTFontDescriptorRef標(biāo)示可下載的字體數(shù)組:
CFDictionary *descriptorOptions = @{(id)kCTFontDownloadableAttribute : @YES};
CTFontDescriptorRef descriptor = CTFontDescriptorCreateWithAttributes((CFDictionaryRef)descriptorOptions);
CFArrayRef fontDescriptors = CTFontDescriptorCreateMatchingFontDescriptors(descriptor, NULL);
系統(tǒng)不會檢查字體是否已存在于磁盤上而將直接返回同樣的列表。另外,這個方法可能會啟用網(wǎng)絡(luò)并造成阻塞,你不應(yīng)該在主線程中使用它。
使用如下基于塊的 API 來下載字體:
bool CTFontDescriptorMatchFontDescriptorsWithProgressHandler(
CFArrayRef descriptors,
CFSetRef mandatoryAttributes,
CTFontDescriptorProgressHandler progressBlock)
這個方法能操作網(wǎng)絡(luò)并傳遞下載進度信息來調(diào)用你的progressBlock方法直到下載成功或者失敗。參考蘋果的 DownloadFont 樣例看如何使用它。
有一些值得注意的地方,這里的字體只在當(dāng)前程序周期內(nèi)有效,下次運行將被重新載入內(nèi)存。因為字體存放在共享空間中,你不能依賴于它們是否可用。很有可能也不能保證的說,系統(tǒng)會清理這個目錄,或者你的程序被拷貝到新的設(shè)備環(huán)境中,而這時又沒有這個字體存在,同時當(dāng)前處于沒有網(wǎng)絡(luò)的環(huán)境中。在 Mac 或是模擬器上,你能根據(jù)kCTFontURLAttribute獲得字體的絕對路徑,加載速度也會提升,但是在 iOS 上是不可能的,因為這個目錄在你程序之外,你需要再次調(diào)用CTFontDescriptorMatchFontDescriptorsWithProgressHandler。
你也可以注冊新的kCTFontManagerRegisteredFontsChangedNotification通知來跟蹤新字體在何時載入到了字體注冊表中。你可以在 WWDC2013 的 Session223 “Using Fonts with TextKit”中查找更多信息。
這還不夠?
沒關(guān)系,iOS7 的新東西遠不止如此!了解一下 NSHipster 你將明白語音合成相關(guān)的東西,base64、NSURLComponents、NSProgress、bar codes、reading lists 以及 CIDetectorEyeBlink。還有很多我們沒有涵蓋到的,比如蘋果 iOS7 的 API 變化,iOS 指南的新東西以及 Foundation Release Notes(這些都是服務(wù)于 OS X的,但是代碼都是共享的,也同樣適用于 iOS)。很多方法都還沒形成文檔,等著你來探究和 blog。
評論