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


83

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

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

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

这工作得很好。

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

Dude_Willie.otf
Impact
handsean.ttf

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

我努力了

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

但这只是回到使用Helvetica。

我如何找到要使用的名字?


第一个相关问题中列出的方法有什么问题?
borrrden


“第一个重复的问题怎么了?” 它什么也没告诉我。我已经打印出[UIFont familyNames],它们都与我的字体无关。
Fogmeister

1
然后您的字体未正确安装
-borrrden

加!我没有在info.plist中添加它们…
Fogmeister

Answers:


84

请按照以下四个简单步骤在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],您应该已经经营了!

2
谢谢,您保存了我的一天
Yahya Alshaar '18 -10-5

123

右键单击TTF->获取信息

您要查找“全名”。

这就是使用TTF的原因。

编辑:

我只是使用了一种与Get Info中的“全名”不同名称的字体。

对于此答案的编译,如果上面的快速检查不起作用,请在您的项目中运行以下代码:

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每次都对我有用。我自己从未创建过字体,所以您可能是正确的,我不知道。
塞格夫

它最有可能适用于制作精良的字体。我们获得的字体大约是在20年前创建的(很糟糕...)。但是,唯一可以确定的方法是询问系统。
borrrden

3
谢谢,在我将字体正确安装在info.plist文件中之后,此方法有效。
Fogmeister

6
这不适用于所有字体。例如,当代码中的族为“ ProximaNova-Regular”时,“全名”值将显示为“ Proxima Nova Regular”
rrbrambley 2014年

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

例


5
似乎是最简单的方法
Eyal Alsheich '17

6
首先,我需要进入“视图”>“显示字体信息”以查看详细信息。不知道为什么默认情况下它在我的机器上是关闭的。
马克·罗布森

41

要在iOS中使用字体,您必须基于字体的FULL NAME(PostScript名称)加载字体,FULL NAME(PostScript名称)有时(通常与字体的实际FILE NAME)不同。

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

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

如果您使用的是Mac或Linux,只需在您拥有自定义字体的目录中的命令行中运行此脚本即可(使用大概已经安装的fontconfig中的fc-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或其他地方引用字体文件。

如果您想了解一些其他信息(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中打开Font检查PostScript名称。

有用的提示:如果您在终端中为上述脚本添加别名,那么您只需输入一个命令即可获取当前目录中所有文件的所有PostScript字体名称(调用了我的函数,fontnames因此我要做的所有事情)fontnames在目录内的终端上键入带有字体的,PostScript名称将自动打印出来,这样可以节省开发流程的时间,并在需要时可以使用此便捷脚本。

希望这可以帮助!


我正在使用Mac。我从提供的链接中下载了fontConfig。但是其中有很多文件。如何使用它或将fontConfig安装到我的Mac。
Sujay联合国

@SujayUN如果您使用的是Mac,则可能已经安装了该fc-scan实用程序。fc-scan -V在终端上运行时会发生什么?
射线录像

3
您也可以通过homebrew:安装fontConfig brew install fontconfig
射线录像

当我运行ur cmd -bash:fc-scan:命令未找到时,我得到了
Sujay UN

好的,如果您的计算机上未安装Homebrew,建议您通过Homebrew安装。请参阅上面我的评论中的Homebrew和install命令链接。
射线录像

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

希望对您有帮助...


6

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

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根据需要替换为自己的可抛对象。


5

斯威夫特3.0

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

5

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


4

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

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

3

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


3

Swift 1.2:

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

2

另一个不涉及扫描模拟器或设备上存在的所有默认字体的“快速,实用”的技巧是将字体用于您的中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>

1

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

// You can log all font family names suing **fontNamesForFamilyName**

NSLog(@" font name %@", [UIFont fontNamesForFamilyName:@"the file name"]);

希望对您有帮助。


似乎对我们不起作用-如果文件名与字体系列名称不同,它将失败
Blitz 2014年

您应该在获取信息中获取字体名称。
Nishant Tyagi 2014年

0

列出带有Swift 4.1的macOS的字体名称和字体家族:

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

-2

支持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

@Fogmeister您接受的答案是这样的,这就是为什么我用较短的方式编写此代码的原因
。– NiravS

此行读取ttf或otf文件,然后提供字体家族及其所有字体名称。.@Fogmeister
NiravS

如果接受的答案与您的答案相同...您为什么要写这个答案?只需编辑已经存在的那个(这就是“编辑”按钮的作用)。不要试图通过复制粘贴他们对微小的,微不足道的更改的答案来窃取他人的代表点。现在,我将接受的问题更改为一个新问题,该问题显示了如何正确安装字体。谢谢
Fogmeister

同样,您的答案是“仅一行代码”,但这几乎是不可读的。我希望有一个包含多行的答案,可以轻松地对其进行扫描以查看其作用。
Fogmeister
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.