如何将CGFontRef转换为UIFont?

我想为UILabel使用自定义字体。 自定义字体由文件加载:

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

我如何将CGFontRef转换为CGFontRef来使用[UILabel setFont:]

康拉德的答案很接近,但是并不奏效。 您需要为UIFont提供PostScript名称,而不是全名。

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

您不能直接将CGFontRef转换为UIFont ,但可以使用CTFontManagerRegisterGraphicsFont注册CTFontManagerRegisterGraphicsFont ,然后创build相应的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]; 

原则上,它们不可直接转换。 一个简单的原因是UIFont封装字体大小,而CGFont是大小无关的(大小是graphics上下文的属性;请参阅CGContextSetFontSize())。

假设你已经确定了你想要的字体大小,你应该可以像这样:

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

我没有真正testing过,但它应该工作(也许有一些小的补充)。 我相信CGFont和UIFont的名称之间有一个对应关系 – 但是如果没有,这显然不起作用。

你可以将你的CGFont转换为CTFont,但不幸的是这些都不会让你成为一个UIFont。 以下是获取UIFont的方法:请求系统字体,或通过其PostScript名称索取字体。 因此,对于UILabel中的自定义提供的字体,我build议你使用后者。

如果您知道应用程序将提前使用的字体文件,则可以将其添加到您的包中,并使用UIFont + fontWithName:size加载: UIFont在包中search带有该PostScript名称的字体文件。

例如,TrueType字体文件“VeraMono.ttf”具有PostScript名称“ Bitstream Vera Sans Mono ”,所以它被加载到如下的UILabel中:

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

要非dynamic地获取PostScript名称,请使用字体工具,或者在上面的情况下,通过Finder> Get Info,PostScript名称恰好等于“全名”显示。

但是,如果您未必事先知道字体的PostScript名称(例如支持用户定义的字体),也许可以将文件名加载到NSData中,并使用“grep”作为其PostScript名称。

祝你好运,