如何将CGFontRef转换成UIFont?

ohh*_*hho 15 iphone uilabel uifont ios

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

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

我怎样才能转换CGFontRefUIFont以中使用[UILabel setFont:]

Jos*_*own 16

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

NSString *fontName = (NSString *)CGFontCopyPostScriptName(fontRef);
UIFont *font = [UIFont fontWithName:fontName size:someSize]
Run Code Online (Sandbox Code Playgroud)

  • 请注意,`CGFontCopyPostScriptName`分配并返回一个`CFStringRef`,你必须在以后的`CFRelease`中找到它.将返回值强制转换为NSString对于可读性来说是个坏主意. (3认同)

小智 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];
Run Code Online (Sandbox Code Playgroud)


rob*_*off 5

CTFontRef并且UIFont免费桥接的,所以你可以把你的CGFont变成 aCTFont然后把它变成 a UIFont

CTFontRef ctFont = CTFontCreateWithGraphicsFont(cgFont, pointSize, NULL, NULL);
UIFont *uiFont = CFBridgingRelease(ctFont);
Run Code Online (Sandbox Code Playgroud)