如何将CGFontRef转换成UIFont?

时间:2012-02-09 05:06:40

标签: iphone ios uilabel uifont

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

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

如何将CGFontRef转换为UIFont以用于[UILabel setFont:]

6 个答案:

答案 0 :(得分:15)

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

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

答案 1 :(得分:15)

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

答案 2 :(得分:3)

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

假设您已经确定了您想要的字体大小,您应该能够:

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

我实际上没有测试过这个,但它应该可以工作(可能还有一些小的补充)。我相信CGFont和UIFont的名称之间存在对应关系 - 但如果没有,这显然不起作用。

答案 3 :(得分:2)

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

如果您知道应用将提前使用的字体文件,您可以将其添加到您的捆绑包并使用 UIFont ,+ fontWithName:size:作为UIFont加载在您的包中搜索具有该PostScript名称的字体文件。

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

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

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

但是,如果您不一定提前知道字体的PostScript名称(例如支持用户定义的字体),也许您可​​以将文件名加载到NSData中,并将“grep”加载到其PostScript名称中......

祝你好运,

答案 4 :(得分:1)

CTFontRefUIFonttoll-free bridged,因此您可以将CGFont转换为CTFont,然后将其转换为UIFont

CTFontRef ctFont = CTFontCreateWithGraphicsFont(cgFont, pointSize, NULL, NULL);
UIFont *uiFont = CFBridgingRelease(ctFont);

答案 5 :(得分:0)

更新了Swift 4以获取PostScript名称(其中font是CGFont):

let fontName = font?.postScriptName as String?
textLabel.font = UIFont(name: fontName!, size: 17)