Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/iphone/37.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Iphone 自定义字体在iOS上无法正确显示_Iphone_Objective C_Fonts - Fatal编程技术网

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

Iphone 自定义字体在iOS上无法正确显示,iphone,objective-c,fonts,Iphone,Objective C,Fonts,我正在尝试在iPhone上使用一套Neo Sans Pro字体。我有四个权重:Light、Regular、Medium、粗体为OTF文件(NeoSansPro-Light.OTF、-Regular.OTF等)。这些文件包含在生成中,并在info.plist中注册 调用[UIFont-fontNamesForFamilyName:@“Neo Sans Pro”]返回一个包含4个条目的数组,例如“Neo Sans Pro Light” 我可以使用UIFont-fontWithName:size:检索

我正在尝试在iPhone上使用一套Neo Sans Pro字体。我有四个权重:Light、Regular、Medium、粗体为OTF文件(NeoSansPro-Light.OTF、-Regular.OTF等)。这些文件包含在生成中,并在info.plist中注册

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

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

但是,当我使用它们绘制文本时,灯光、常规和中等版本都绘制完全相同的文本,并且看起来像灯光版本。粗体版画的不同

根据字体手册,每个字体文件包含不同的字形

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

[补充] 更多的调查:

 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
名称:NeoSansPro浅色字体:字体系列:“Neo Sans Pro”;字体大小:正常;字体风格:普通;字号:12px
名称:NeoSansPro常规字体:字体系列:“Neo Sans Pro”;字体大小:正常;字体风格:普通;字号:12px
名称:NeoSansPro中字体:字体系列:“Neo Sans Pro”;字体大小:正常;字体风格:普通;字号:12px
名称:NeoSansPro粗体字体:字体系列:“Neo Sans Pro”;字体大小:粗体;字体风格:普通;字号:12px

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

看起来这和这里的问题一样:

如果同一字体系列中有多个字体,并且无法返回正确的字体,那么iOS字体体系结构似乎会变得混乱。解决方案是手动编辑字体系列信息(使用类似于修改不同值的内容)

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

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


很难看,但它可以工作。

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

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

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

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

也尝试作为TTF文件,但同样的情况发生了您是否在安装了同一系列的几种字体的情况下进行了测试?我看到的问题是[UIFont fontWithName:]不起作用,因此您的解决方案显然不起作用,如果[UIFont fontWithName:]起作用返回某些内容。如果不是这样,我不确定问题是否在于您有同一系列的多个字体。多个字体应返回多个数组entries我同意[UIFont fontWithName]应该返回多个项目,但由于苹果代码中没有错误。因此解决上述问题。一些澄清:在Font Forge中,这可以在“Font Info”下的“Element”菜单中找到。此外,将字体系列设置为什么并不重要,基本上你只是将其从原始系列中更改,以便iOS找到它使用其唯一的名称,而不是族/重量。