2012-02-09 21 views
12

我想爲UILabel使用自定義字體。如何將CGFontRef轉換爲UIFont?

NSString *fontPath = ... ; // a TTF file in iPhone Documents folder 
CGDataProviderRef fontDataProvider = CGDataProviderCreateWithFilename([fontPath UTF8String]); 
CGFontRef customFont = CGFontCreateWithDataProvider(fontDataProvider); 
CGDataProviderRelease(fontDataProvider); 

我怎麼能轉換CGFontRefUIFont[UILabel setFont:]使用:自定義字體是從文件加載?

+2

您需要支持哪些iOS版本?您可以通過編輯Info.plist將捆綁的字體加載爲「UIFont」實例。 – Costique 2012-02-09 05:19:00

+1

我不確定將CGFontRef轉換爲UIFont,但您可以創建一個需要CGFontRef的UILabel的子類。檢查這[博客](http://blog.mro.name/2010/08/uilabel-with-a-custom-cgfont/)這樣做 – 2012-02-09 05:34:35

+0

@Costique iOS 4.3或更高版本是好的。下載應用程序後,用戶添加字體,因此我無法預設Info.plist。 – ohho 2012-02-09 06:24:13

回答

15

康拉德的答案是接近,但不起作用。您需要爲UIFont提供PostScript名稱,而不是全名。

NSString *fontName = (NSString *)CGFontCopyPostScriptName(fontRef); 
UIFont *font = [UIFont fontWithName:fontName size:someSize] 
+0

+1,正確的,應該使用post腳本名否則會註冊失敗。 – ZYiOS 2012-11-15 08:28:20

+3

請注意''CGFontCopyPostScriptName'分配並返回'CFStringRef',你必須稍後'CFRelease'。將返回值轉換爲NSString對於可讀性來說是個壞主意。 – 2013-03-30 10:46:31

3

它們原則上不可直接轉換。一個簡單的原因是UIFont封裝字體大小,而CGFont是大小無關的(大小是圖形上下文的屬性;請參閱CGContextSetFontSize())。

假設你已經另有決定你想要的字體大小,你應該能夠像:

NSString *fontName = (NSString *)CGFontCopyFullName(someCGFontRef); 
UIFont *font = [UIFont fontWithName:fontName size:someSize]; 
[fontName release]; 

我沒有實際測試過這一點,但它應該工作(也許有一些小的補充) 。我相信CGFont和UIFont的名稱之間存在對應關係 - 但如果不存在,這顯然不起作用。

2

您可以將您的CGFont轉換爲CTFont,但不幸的是,這些都不會讓您獲得UIFont。以下是獲取UIFont的方法:請求系統字體,或通過其PostScript名稱索要字體。因此,對於UILabel中的自定義提供的字體,我建議您使用後者。

如果你知道的字體文件您的應用程序將利用領先的時候,你可以把它添加到你的包,並與加載UIFont,+ fontWithName:尺寸:爲UIFont搜索您的捆綁與該字體文件PostScript名稱。

例如,TrueType字體文件 「VeraMono.ttf」 有Postscript名稱 「碼流維拉國界單」,所以它裝入一個UILabel,如:

label.font = [UIFont fontWithName:@"Bitstream Vera Sans Mono" size:12];

要得到的PostScript名稱中包含非 - 動態地,使用字體工具,或者在上面的情況下,PostScript名稱恰好等於Finder> Get Info中的「全名」顯示。

但是,對於未必事先知道字體的PostScript名稱的情況(例如支持用戶定義的字體),也許可以將文件名加載到NSData中,並使用「grep」作爲其PostScript名稱。

祝你好運,

+0

謝謝你的解釋。你的迴應與約什布朗的回答在4年後幫助了我! – 2016-04-29 14:52:59

15

您不能轉換CGFontRefUIFont直接,但你可以使用CTFontManagerRegisterGraphicsFont註冊CGFontRef並創建相應的UIFont

NSString* fpath = [documentsDirectory stringByAppendingPathComponent:@"custom_font_file_name.ttf"]; 
CGDataProviderRef fontDataProvider = CGDataProviderCreateWithFilename([fpath UTF8String]); 
CGFontRef customFont = CGFontCreateWithDataProvider(fontDataProvider); 
CGDataProviderRelease(fontDataProvider); 
NSString *fontName = (__bridge NSString *)CGFontCopyFullName(customFont); 
CFErrorRef error; 
CTFontManagerRegisterGraphicsFont(customFont, &error); 
CGFontRelease(customFont); 
UIFont* uifont = [UIFont fontWithName:fontName size:12]; 
+0

我得到這個錯誤加載字體失敗:操作無法完成。 (com.apple.coretext錯誤105 - 無法註冊CGFont'') – Durgaprasad 2013-05-03 10:56:57

+0

documentsDirectory ..「使用未聲明的標識符」documentsDirectory'...你的意思是?....?? ? – Morkrom 2013-06-21 20:30:31

+2

錯誤105 =字體已經註冊 – dulgan 2014-05-06 12:03:53

相關問題