如何从otf或ttf文件中获取字体名称?

102

我在之前的应用程序中使用了一种自定义字体。

文件名为“ProximaNova-Regular.otf”,要加载该字体,我只是使用了...

[UIFont fontWithName:@"ProximaNova-Regular" size:20];

这个运作得非常完美。

现在在这个新应用程序中,我有三个字体文件...

Dude_Willie.otf
Impact
handsean.ttf

但我不确定如何加载它们。

我已经尝试过

[UIFont fontWithName:<the file name> size:20];

但这只是回到使用Helvetica的问题。

我该如何找到要使用的名称?


可能是 iPhone 上的非系统字体名称 的重复问题。 - borrrden
@FyodorVolchyok 啊,看看评论。我已经忽略了那个问题。我遇到的问题是项目中我没有正确安装字体,所以列出 familyNames 并没有显示我要查找的字体。 - Fogmeister
fc-scan --format "%{foundry}: %{family}\n" filename.ttffilename.otf. - Dave Jarvis
15个回答

137

右键点击TTF文件 -> 获取信息

"全名"是您要查找的内容。

这就是我处理TTF文件时使用的方法。

编辑:

我刚刚使用了一个字体,它的名称与“获取信息”中的“全名”不同。

对于本答案的编写,如果上述快速检查无法解决问题,请在您的项目中运行此代码:

for (NSString *fontFamilyName in [UIFont familyNames]) {
    for (NSString *fontName in [UIFont fontNamesForFamilyName:fontFamilyName]) {
        NSLog(@"Family: %@    Font: %@", fontFamilyName, fontName);
    }
}

搜索您想使用的字体的正确名称。

Swift 3.0 代码:

for fontFamilyName in UIFont.familyNames{
    for fontName in UIFont.fontNames(forFamilyName: fontFamilyName){
        print("Family: \(fontFamilyName)     Font: \(fontName)")
    }
}

这真的取决于字体制造商。我们曾经从客户那里收到一些可怕的字体,一旦它们被iOS消耗,字体名称就变得非常任意。我刚刚尝试了我们的其中一种字体,但失败了。 - borrrden
@borrrden 到目前为止,这种方法每次都对我有效。我从未自己创建过字体,所以你可能是正确的,我不知道。 - Segev
@borrrden 或者花两秒钟右键点击并尝试出现的名称。 :) 如果这行不通 ~ 那么挖掘开始了.. - Segev
3
谢谢,这个方法在我正确安装字体到 info.plist 文件后成功了。 - Fogmeister
6
这并不适用于所有字体。例如,当代码中的字族为“ProximaNova-Regular”时,“全名”值显示为“Proxima Nova Regular”。 - rrbrambley
显示剩余7条评论

102

按照以下四个简单步骤,在你的iOS应用中添加并使用一个新字体:

  • your_new_font.ttfyour_new_font.otf添加到你的Xcode项目中
  • 在你项目的info.plist文件中,将your_new_font.ttfyour_new_font.otf添加到UIAppFonts数组中的新条目中(此条目的纯文本为“应用程序提供的字体”)
  • 此时,我建议添加这个临时的调试代码块,以便倾印出你的应用程序可以访问的所有字体,包括你新添加的your_new_font

//Swift

    for family: String in UIFont.familyNames {
        print("\(family)")
        for names: String in UIFont.fontNames(forFamilyName: family) {
            print("== \(names)")
        }
    }

//Objective-c

for(NSString *fontfamilyname in [UIFont familyNames]) {
    NSLog(@"family:'%@'",fontfamilyname);
    for(NSString *fontName in [UIFont fontNamesForFamilyName:fontfamilyname]) {
        NSLog(@"\tfont:'%@'",fontName);
    }
    NSLog(@"-------------");
}
在调试输出中查找您的新字体的“family”和“font”名称。将与您的新字体系列对应的“font”名称(可能有多个与您的新字体系列关联的“font”)传递给UIFont *myNewFont = [UIFont fontWithName:@"font_name_from_debug_output" size:20],然后您就可以使用它了!

87
  • 安装字体
  • 在您的Mac上打开Font Book应用程序
  • 选择字体,然后单击“信息”按钮
  • 您要查找的名称是 PostScript名称
    • MacOS:查看->显示字体信息

example


5
似乎是最简单的方法。 - Eyal Alsheich
12
值得一提的是,我需要转到“查看”>“显示字体信息”才能查看详细信息。不确定为什么这在我的计算机上默认是关闭的。 - Mark Robson

48

要在iOS中使用字体,必须根据字体的完整名称(PostScript名称)加载字体,该名称有时(通常)与字体的实际文件名称不同。

想象一下你将字体文件“Arial-regular.ttf”重命名为“foo.ttf”。你刚刚重命名的字体文件内包含的字体仍然是“Arial-regular”。

本主题已经提供了一些获取字体名称的良好程序化方法,但我有一个使用命令行的不同方法。

如果您使用的是Mac或Linux,请在存储自定义字体的目录中从命令行运行此脚本(使用fontconfigfc-scan工具,该工具可能已安装,但如果没有,可以通过homebrew进行安装:brew install fontconfig):

for file in "$arg"*.{ttf,otf}; do fc-scan --format "%{postscriptname}\n" $file; done

这是我在~/Library/Fonts目录上运行上述命令的截图:

在此输入图片描述

以上脚本将遍历当前目录中所有的.ttf.otf文件,然后打印出每个字体的PostScript名称,您可以使用该名称在XCode或其他地方引用字体文件。

如果您想要一些附加信息(PostScript名称、文件名)和一些颜色编码,您可以运行此替代脚本:

for file in "$arg"*.{ttf,otf}; do 
    postscriptname=$(fc-scan --format "%{postscriptname}\n" $file);
    printf "\033[36m PostScript Name:\033[0m %s \e[90m(%s)\033[0m\n" "$postscriptname" "$file";
done

输入图片说明

这比将代码复制粘贴到AppDelegate.m文件中以打印名称的普遍方法快一些,而且比打开FontBook来检查PostScript名称也更快。

实用提示:如果您在终端中为上述脚本设置别名,那么每次只需键入一个命令即可获取当前目录中所有文件的PostScript字体名称(我的函数称为fontnames,因此我只需在包含字体的目录中的终端内键入fontnames,就会自动打印出PostScript名称),这将节省您在开发工作流程中的时间,并准备好这个方便的脚本在需要时使用。

希望这有所帮助!


我正在使用Mac电脑。我从您提供的链接下载了fontConfig,但是它里面有很多文件。我该如何使用或将fontConfig安装到我的Mac电脑上? - Sujay U N
@SujayUN 如果你使用的是Mac,你可能已经安装了fc-scan工具。当你在终端上运行fc-scan -V命令时会发生什么? - radiovisual
3
您可以通过 homebrew 安装 fontConfig:brew install fontconfig - radiovisual
当我运行您的命令时,出现了这个错误:-bash: fc-scan: 命令未找到。 - Sujay U N
好的,如果您的机器上没有安装Homebrew,我建议您通过Homebrew进行安装。请参见我上面评论中的Homebrew链接和安装命令。 - radiovisual
第二个脚本正是我所需要的。谢谢! - squirtgun

10
如果您想在程序中自动查找给定字体文件的字体名称:
import Foundation

func loadFontName(for file: URL) throws -> String {
    let data = try Data(contentsOf: file)

    guard let provider = CGDataProvider(data: data as CFData) else {
        throw Error("Could not create data provider")
    }

    guard let font = CGFont(provider) else {
        throw Error("Could not load font")
    }

    guard let name = font.postScriptName else {
        throw Error("Could not get font name from font file")
    }

    return name as String
}

根据需要替换为自己的可抛出Error对象。


9

Swift 4.0+解决方案

    for fontFamilyName in UIFont.familyNames {
        print("family: \(fontFamilyName)\n")

        for fontName in UIFont.fontNames(forFamilyName: fontFamilyName) {
            print("font: \(fontName)")
        }
    }

输出结果为:

字体族:苹方

字体:PingFangSC-Thin

字体:PingFangSC-Light


6
你想知道如何获取名称,请按照以下步骤操作:
  NSArray *familyNames = [[NSArray alloc] initWithArray:[UIFont familyNames]];

  for (NSInteger indFamily=0; indFamily<[familyNames count]; ++indFamily) 
  {
        NSLog(@"Family name: %@", [familyNames objectAtIndex:indFamily]);

        NSArray *fontNames = [[NSArray alloc] initWithArray:
              [UIFont fontNamesForFamilyName:[familyNames objectAtIndex:indFamily]]];

        for (NSInteger indFont=0; indFont<[fontNames count]; ++indFont) 
        {
              NSLog(@"    Font name: %@", [fontNames objectAtIndex:indFont]);
        }
  }

希望这对您有所帮助...


5

Swift 3.0

for familyName in UIFont.familyNames {
        for fontName in UIFont.fontNames(forFamilyName: familyName ) {
            print("\(familyName) : \(fontName)")
        }
    }

4
在将字体添加到您的项目/应用程序后,请添加此代码(可能只在应用程序delegate的didFinishLaunchingWithOptions方法中)以打印出应用程序中所有可用的字体。从该列表内,您应该能够识别出您需要的字体。不要忘记在完成后删除不必要的代码。
for (NSString *fontFamilyName in [UIFont familyNames]) {
    for (NSString *fontName in [UIFont fontNamesForFamilyName:fontFamilyName]) {
        NSLog(@"Family: %@    Font: %@", fontFamilyName, fontName);
    }
}

4
您可以使用otfinfo --info arial.ttf从命令行获取名称。需要传递给UIFont构造函数的是postscript名称。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接