【问题标题】:How do I get the font name from an otf or ttf file?如何从 otf 或 ttf 文件中获取字体名称?
【发布时间】:2026-02-01 19:55:02
【问题描述】:

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

文件名为“ProximaNova-Regular.otf”并加载我刚刚使用的字体...

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

效果很好。

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

Dude_Willie.otf
Impact
handsean.ttf

但我不确定如何加载这些。

我试过了

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

但这只是回退到使用 Helvetica。

如何找到要使用的名称?

【问题讨论】:

标签: ios uifont


【解决方案1】:

右键单击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 到目前为止,这种方法每次都对我有用。我从来没有自己创建过字体,所以你可能是对的,我不知道。
  • 它很可能适用于制作精良的字体。我们得到的字体是大约 2 年前创建的(很糟糕......)。但是,唯一可以确定的方法是询问系统。
  • 谢谢,在我正确安装 info.plist 文件中的字体后,此方法有效。
  • 这不适用于所有字体。例如,当代码中的family为“ProximaNova-Regular”时,“Full Name”值显示为“Proxima Nova Regular”
【解决方案2】:

按照以下四个简单步骤在您的 iOS 应用中添加和使用新字体:

  • your_new_font.ttfyour_new_font.otf 添加到您的 Xcode 项目中
  • 在项目的 info.plist 中,将 your_new_font.ttfyour_new_font.otf 的新条目添加到 UIAppFonts 数组(此条目的纯文本为 '应用程序提供的字体')
  • 此时,我建议添加此临时调试代码块以转储您的应用可访问的所有字体,包括您新添加的 your_new_font:

//斯威夫特

    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(@"-------------");
}
  • 在调试输出中,查找新字体的“系列”和“字体”名称。将显示为与您的新字体系列相对应的“字体”名称(可能有多个“字体”与您的新字体“系列”相关联)传递给UIFont *myNewFont = [UIFont fontWithName:@"font_name_from_debug_output" size:20],您应该可以做生意了!

【讨论】:

    【解决方案3】:
    • 安装字体
    • 在 Mac 上打开 Font Book 应用
    • 选择字体并点击“信息”按钮
    • 您要查找的名称是 PostScript 名称
      • MacOS:查看 -> 显示字体信息

    【讨论】:

    • 似乎是最简单的方法
    • fwiw,我需要去查看 > 显示字体信息以查看详细信息。不知道为什么它在我的机器上默认是关闭的。
    【解决方案4】:

    要在 iOS 中使用字体,您必须根据字体的 FULL NAME(PostScript 名称)加载字体,这有时(通常是)不同于字体的实际 文件名。

    想象一下自己将字体文件“Arial-regular.ttf”重命名为 “foo.ttf”。您刚刚重命名的字体文件中包含的字体仍然是 “Arial-常规”。

    有一些很好的编程方法可以在这个线程上获取字体名称,但我使用命令行有不同的方法。

    如果您使用的是 Mac 或 Linux,只需从您拥有自定义字体的目录中的命令行运行此脚本(使用可能已经安装的 fontconfig 中的 fc-scan 实用程序,但如果您没有安装可以通过自制软件安装:brew install fontconfig):

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

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

    上面的脚本会遍历当前目录下的所有.ttf.otf文件,然后打印出每个字体的PostScript Name,你可以用它来引用字体文件XCode 或其他地方。

    如果您想了解一些附加信息(PostScriptName、Filename)和一些颜色编码,您可以运行这个替代脚本:

    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。
    • @SujayUN 如果您使用的是 Mac,您可能已经安装了 fc-scan 实用程序。在终端上运行fc-scan -V 会发生什么?
    • 你也可以通过homebrew:brew install fontconfig安装fontConfig。
    • 我在运行你的 cmd -bash: fc-scan: command not found 时得到了这个
    • 好的,如果您的机器上没有安装 Homebrew,我建议您通过 Homebrew 安装。在我上面的评论中查看 Homebrew 和安装命令的链接。
    【解决方案5】:

    如果您想以编程方式查找给定字体文件的字体名称:

    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 对象。

    【讨论】:

      【解决方案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]);
              }
        }
      

      希望对你有帮助...

      【讨论】:

        【解决方案7】:

        Swift 4.0+解决方案

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

        将输出:

        系列:Apple SD Gothic Neo

        字体:AppleSDGothicNeo-Thin

        字体:AppleSDGothicNeo-Light

        【讨论】:

          【解决方案8】:

          斯威夫特 3.0

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

          【讨论】:

            【解决方案9】:

            将字体添加到项目/应用后,添加此代码(可能只是在应用委托的 didFinishLaunchingWithOptions 方法中)以打印出应用的所有可用字体。从该列表中,您应该能够识别您所追求的字体。之后不要忘记删除不必要的代码。

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

            【讨论】:

              【解决方案10】:

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

              【讨论】:

                【解决方案11】:

                斯威夫特 1.2:

                    for familyName in UIFont.familyNames() {
                        for fontName in UIFont.fontNamesForFamilyName(familyName as! String) {
                            println("\(familyName) : \(fontName)")
                        }
                    }
                

                【讨论】:

                  【解决方案12】:

                  另一个不涉及扫描模拟器或设备上存在的所有默认字体的“快速实用”技巧是将字体用于storyboard 中的某些内容。然后,如果您使用文本编辑器(以source code 打开)编辑情节提要,如果您搜索“customFonts”标签,则可以看到与“内部”名称一起使用的字体:

                  <customFonts key="customFonts">
                      <array key="Linotype - AvenirNextLTPro-Bold.otf">
                          <string>AvenirNextLTPro-Bold</string>
                      </array>
                      <array key="Linotype - AvenirNextLTPro-Regular.otf">
                          <string>AvenirNextLTPro-Regular</string>
                      </array>
                      <array key="TradeGothicLTPro-BdCn20.otf">
                          <string>TradeGothicLTPro-BdCn20</string>
                      </array>
                  </customFonts>
                  

                  【讨论】:

                    【解决方案13】:

                    记录字体文件的familyNames,然后访问字体:

                    // You can log all font family names suing **fontNamesForFamilyName**
                    
                    NSLog(@" font name %@", [UIFont fontNamesForFamilyName:@"the file name"]);
                    

                    希望对你有帮助。

                    【讨论】:

                    • 似乎对我们不起作用 - 如果文件名与字体系列名称不同,则会失败
                    • 你应该在获取信息中获取字体名称。
                    【解决方案14】:

                    使用 Swift 4.1 列出 ma​​cOS 的字体名称和系列:

                    NSFontManager.shared.availableFonts.map { print($0) }
                    NSFontManager.shared.availableFontFamilies.map { print($0) }
                    

                    【讨论】:

                      【解决方案15】:

                      支持 Swift 4.0

                      这只是打印所有字体系列及其字体名称的一行代码

                      override func viewDidLoad() {
                          super.viewDidLoad()
                          //Main line of code
                          UIFont.familyNames.sorted().forEach({ print($0); UIFont.fontNames(forFamilyName: $0 as String).forEach({print($0)})})
                      }
                      

                      【讨论】:

                      • 阅读问题。
                      • @Fogmeister 您接受的答案与此相同,这就是我以更短的方式编写此代码的原因..
                      • 这一行读取 ttf 或 otf 文件,然后给出字体系列和所有字体名称.. @Fogmeister
                      • 如果接受的答案与你的相同......你为什么要写这个?只需编辑已经存在的那个(这就是编辑按钮的用途)。不要试图通过复制粘贴他们对微小、无关紧要的更改的答案来窃取其他人的代表点数。我现在已将接受的问题更改为更新的问题,该问题显示了如何正确安装字体。谢谢
                      • 另外,你的答案是“只有一行代码”,但它几乎不可读。我更喜欢包含多行的答案,可以轻松扫描以查看它在做什么。