我想为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:]
?
答案 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)
CTFontRef
和UIFont
为toll-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)