92

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

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

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

这非常有效。

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

Dude_Willie.otf
Impact
handsean.ttf

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

我努力了

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

但这只是回退到使用 Helvetica。

如何找到要使用的名称?

4

15 回答 15

128

右键单击 TTF -> 获取信息

“全名”是您要查找的内容。

这就是 TTF 对我有用的东西。

编辑:

我只是使用了与获取信息中的“全名”不同名称的字体。

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

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

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

斯威夫特 3.0 代码:

for fontFamilyName in UIFont.familyNames{
    for fontName in UIFont.fontNames(forFamilyName: fontFamilyName){
        print("Family: \(fontFamilyName)     Font: \(fontName)")
    }
}
于 2013-05-28T09:27:28.217 回答
98

按照以下四个简单步骤在您的 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)")
        }
    }

//目标-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]您,您应该开始营业了!
于 2013-07-15T22:43:19.977 回答
77
  • 安装字体
  • 在 Mac 上打开 Font Book 应用
  • 选择字体并点击“信息”按钮
  • 您要查找的名称是PostScript 名称
    • MacOS:查看 -> 显示字体信息

例子

于 2017-08-01T17:06:58.847 回答
46

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

想象一下自己将字体文件“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 或其他地方的字体文件。

如果你想了解一些附加信息(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 名称将自动打印,然后您将节省开发工作流程的时间,并在需要时准备好使用这个方便的脚本。

希望这可以帮助!

于 2017-01-13T14:07:43.460 回答
8

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

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

于 2016-11-01T12:15:03.723 回答
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]);
        }
  }

希望它可以帮助你...

于 2013-05-28T09:28:42.393 回答
6

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

于 2018-11-12T01:36:34.063 回答
5

斯威夫特 3.0

for familyName in UIFont.familyNames {
        for fontName in UIFont.fontNames(forFamilyName: familyName ) {
            print("\(familyName) : \(fontName)")
        }
    }
于 2016-10-15T09:28:25.880 回答
4

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

于 2015-02-24T10:50:16.440 回答
4

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

for (NSString *fontFamilyName in [UIFont familyNames]) {
    for (NSString *fontName in [UIFont fontNamesForFamilyName:fontFamilyName]) {
        NSLog(@"Family: %@    Font: %@", fontFamilyName, fontName);
    }
}
于 2014-06-12T13:27:06.717 回答
3

斯威夫特 1.2:

    for familyName in UIFont.familyNames() {
        for fontName in UIFont.fontNamesForFamilyName(familyName as! String) {
            println("\(familyName) : \(fontName)")
        }
    }
于 2015-05-29T02:23:17.580 回答
3

另一个不涉及扫描模拟器或设备上存在的所有默认字体的“快速、实用”技巧是将字体用于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>
于 2017-05-01T21:28:05.860 回答
1

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

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

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

希望它可以帮助你。

于 2013-05-28T09:30:49.063 回答
0

使用Swift 4.1列出macOS的字体名称和系列:

NSFontManager.shared.availableFonts.map { print($0) }
NSFontManager.shared.availableFontFamilies.map { print($0) }
于 2018-02-28T22:52:01.440 回答
-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)})})
}
于 2018-01-18T09:56:56.997 回答