【问题标题】:Custom fonts not displaying correctly on iOS自定义字体在 iOS 上无法正确显示
【发布时间】:2011-10-08 00:15:46
【问题描述】:

我正在尝试让一组 Neo Sans Pro 字体在 iPhone 上运行。我有四个权重:Light、Regular、Medium、Bold 作为 OTF 文件(NeoSansPro-Light.otf、-Regular.otf 等)。这些文件包含在构建中,并在 info.plist 中注册。

调用 [UIFont fontNamesForFamilyName:@"Neo Sans Pro"] 返回一个包含 4 个条目的数组,例如“NeoSansPro-Light”。

我可以使用UIFont fontWithName:size: 检索每个字符串的字体对象。

但是,当我用它们绘制文本时,Light、Regular 和 Medium 版本都绘制完全相同,并且看起来像 Light 版本。粗体版的画法不同。

根据 Font Book,每个字体文件确实包含不同的字形。

我完全被难住了——有什么线索我需要做什么吗?

[添加] 更多调查:

 NSArray *fonts = [UIFont fontNamesForFamilyName:@"Neo Sans Pro"];

    for (NSString *fname in fonts) {
        UIFont *font = [UIFont fontWithName:fname size:12.0];
        NSLog(@"name: %@ font: %@", fname, font);
    }

运行此代码会给出以下日志输出:

 name: NeoSansPro-Light font: <UICFFont: 0x66304a0> font-family: "Neo Sans Pro"; font-weight: normal; font-style: normal; font-size: 12px
 name: NeoSansPro-Regular font: <UICFFont: 0x66304a0> font-family: "Neo Sans Pro"; font-weight: normal; font-style: normal; font-size: 12px
 name: NeoSansPro-Medium font: <UICFFont: 0x66304a0> font-family: "Neo Sans Pro"; font-weight: normal; font-style: normal; font-size: 12px
 name: NeoSansPro-Bold font: <UICFFont: 0xaa06070> font-family: "Neo Sans Pro"; font-weight: bold; font-style: normal; font-size: 12px

所以显示相同的三种字体实际上是相同的。但是构建中有四种字体粗细和四种字体。

【问题讨论】:

  • 也尝试作为 TTF 文件,但同样发生

标签: iphone objective-c fonts


【解决方案1】:

我使用的是一种名为 Arvo 的 Google 字体。它有以下文件:

  • Arvo-Regular.ttf
  • Arvo-Bold.ttf
  • Arvo-BoldItalic.ttf
  • Arvo-Italic.ttf

这些名称已添加到我的应用程序的 info.plist 中,但由于某种原因,我的应用程序只能读取粗体、粗体和斜体字体。当我尝试加载它时,它无法读取常规字体。但是,在打印出字体名称后,发现 Arvo-Regular 在我的应用程序中被识别为 Arvo。

【讨论】:

    【解决方案2】:

    Font forge 对我来说看起来有点太多了,所以我创建了一个方法来读取某个系列的 fontsArray 中的字体描述并返回适当的字体。

    - (UIFont*) getFontWithFamilyName:(NSString*)familyName bold:(Boolean)bold italic:(Boolean)italic size:(uint)size {
        NSArray *fonts = [UIFont fontNamesForFamilyName:familyName];
        for (NSString *fname in fonts) {
           UIFont *font = [UIFont fontWithName:fname size:size];
           Boolean isBold = [[font description] rangeOfString:@"bold"].location != NSNotFound;
           Boolean isItalic = [[font description] rangeOfString:@"italic"].location != NSNotFound;
           if (isBold == bold && isItalic == italic) {
              return font;
           }
        }
        //-- font was not found, provide system font bold or normal
        if (bold) {
           return [UIFont boldSystemFontOfSize:size];
        } else {
           return [UIFont systemFontOfSize:size];
        }
    }
    

    【讨论】:

    • 您是否使用安装了同一系列的几种字体对此进行了测试?我看到的问题是 [UIFont fontWithName:] 不起作用,所以你的解决方案也不会
    • 显然,如果 [UIFont fontWithName:] 返回某些内容,则此方法有效。如果它不适合你,我不确定问题是否在于你有同一系列的多种字体。多种字体应返回多个数组条目
    • 我同意 [UIFont fontWithName] 应该返回多个项目,但由于它存在 Apple 代码中的错误。因此,上述解决方法。
    【解决方案3】:

    看起来和这里的问题一样:Including multiple fonts of the same family in an iPad application

    如果同一字体系列中有多种字体,iOS 字体架构似乎会变得混乱,并且不会交还正确的字体。解决方案是手动编辑字体系列信息(使用 Font Forge 之类的内容更改为不同的值。

    例如对于 Neo Sans Pro Light 字体,将字体系列(在 PSNames 和 TTF 名称中)设置为“NSP Light”。对 Neo Sans Pro Regular -> NSP Regular 等执行类似操作。

    然后您可以通过原始名称来引用字体,例如“NeoSansPro-Light”

    丑陋,但它有效。

    【讨论】:

    • 一些澄清:在 Font Forge 中,可以在“字体信息”下的“元素”菜单中找到。此外,您将字体系列设置为什么并不重要,基本上您只是将其从原始系列更改,以便 iOS 通过其唯一名称而不是系列/重量找到它。
    猜你喜欢
    • 2019-06-06
    • 2012-10-02
    • 1970-01-01
    • 1970-01-01
    • 2012-12-28
    • 2012-03-22
    • 1970-01-01
    • 1970-01-01
    • 2019-07-15
    相关资源
    最近更新 更多