自定义字体在iOS上无法正确显示

时间:2011-07-18 20:22:18

标签: iphone objective-c fonts

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

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

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

然而,当我用它们绘制文本时,Light,Regular和Medium版本都绘制完全相同,看起来像Light版本。 Bold版本的描述不同。

根据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

所以显示相同的三种字体确实是相同的。但是构建中有四种字体权重和四种字体。

3 个答案:

答案 0 :(得分:10)

看起来这是与此处相同的问题:Including multiple fonts of the same family in an iPad application

如果同一个字体系列中有多个字体,并且不会回传正确的字体,那么iOS字体架构似乎会变得混乱。解决方案是手动编辑字体系列信息(使用类似Font Forge的不同值。

E.g。对于Neo Sans Pro Light字体,将字体系列(在PSNames和TTF名称中)设置为“NSP Light”。同样适用于Neo Sans Pro Regular - &gt; NSP Regular等。

然后,您可以按原始名称引用字体,例如“NeoSansPro-光”

丑陋,但确实有效。

答案 1 :(得分:0)

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];
    }
}

答案 2 :(得分:0)

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

  • 帕特-Regular.ttf
  • 帕特-Bold.ttf
  • 帕特-BoldItalic.ttf
  • 帕特-Italic.ttf

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

相关问题