V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
codeplayer
V2EX  ›  iOS

有什么接口能取得 iOS 上中文字体名字吗?想用 freetype 渲染文字,需要详细字体信息。

  •  
  •   codeplayer · 2015-12-23 21:26:44 +08:00 · 3858 次点击
    这是一个创建于 3040 天前的主题,其中的信息可能已经有所发展或是发生改变。

    因为是做游戏,所以不能直接用 coretext ,想用 freetype ,现在知道 STHeitiSC_Light 是 iOS 自带的简体中文字体,但是不敢 hardcode ,又没找到系统接口返回这个信息。
    故有此问,烦请指点。

    9 条回复    2015-12-24 10:32:12 +08:00
    wanganjun
        1
    wanganjun  
       2015-12-23 22:14:32 +08:00 via iPhone
    有一个返回值是数组的函数可以得到所有字体的名字,在 UIFont 头文件里,应该很好认出来的
    11
        2
    11  
       2015-12-23 22:49:06 +08:00
    font.fontName

    font.fontDescriptor
    ibireme
        3
    ibireme  
       2015-12-24 00:11:55 +08:00
    STHeiti 是 iOS 8 及以前的中文字体, PingFang SC 是 iOS9 的中文字体,这个根据系统版本写死是没啥问题的。

    这个网站可以查询每一版本的 iOS 字体列表: http://iosfonts.com/
    ibireme
        4
    ibireme  
       2015-12-24 00:15:55 +08:00
    最保险的做法,是用 CoreText 创建一段中文排版结果,然后从 CTRunRef 中获取最终 fallback 到的中文字体 PostScript 名称。
    codeplayer
        5
    codeplayer  
    OP
       2015-12-24 07:49:57 +08:00
    按系统版本写死还是怕未来版本不兼容。
    目前找到一个方法,应该还算保险。用 UIFont 的 familyNames 和 fontNames 遍历所有字体名字,分别创建 CTFontRef ,然后获取里面支持的语言列表,找 zh-Hans (繁体可以找 zh-Hant),再结合 style name ,找 regular 的。
    另外试了在 iOS9 下面用 STHeitiSC-Medium 其实也能创建字体,创建出来的字体名字还是 PingFangSC ,所以这方面苹果还是考虑了向后兼容的问题的。
    codeplayer
        6
    codeplayer  
    OP
       2015-12-24 07:50:47 +08:00
    @ibireme CTRunRef 里面好像也拿不到 fallback 后的字体名字吧?
    codeplayer
        7
    codeplayer  
    OP
       2015-12-24 07:58:44 +08:00
    CTRun attributes: {
    NSFont = "<UICTFont: 0x797469b0> font-family: \"PingFangSC-Regular\"; font-weight: normal; font-style: normal; font-size: 12.00pt";
    }

    好像确实可以,不知道这个 key 的名字苹果会不会维护向后兼容的。
    ibireme
        8
    ibireme  
       2015-12-24 10:00:43 +08:00
    kCTFontAttributeName 和 NSFontAttributeName 的实际值就是 @"NSFont" 这个是可以直接用。
    另外,从 iOS 7 开始, UIFont 和 CTFontRef 是 Toll-free bridging 的。
    codeplayer
        9
    codeplayer  
    OP
       2015-12-24 10:32:12 +08:00
    @ibireme 嗯,可以用,不过我那个方法也不错,可以按照语言进行选择。
    另外, android 上面这个问题,我也还没找到方法,有没有什么想法?
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   我们的愿景   ·   实用小工具   ·   864 人在线   最高记录 6543   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 30ms · UTC 21:40 · PVG 05:40 · LAX 14:40 · JFK 17:40
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.