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

时间:2013-05-28 09:19:39

标签: ios uifont

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

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

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

这很有效。

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

Dude_Willie.otf
Impact
handsean.ttf

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

我试过了

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

但这只是回到使用Helvetica。

如何找到要使用的名称?

15 个答案:

答案 0 :(得分:115)

右键点击TTF - &gt;获取信息

“全名”是您正在寻找的。

这对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)")
    }
}

答案 1 :(得分:58)

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

  • your_new_font.ttf your_new_font.otf 添加到您的Xcode项目
  • 在项目的info.plist中,为 your_new_font.ttf your_new_font.otf 添加一个新条目到UIAppFonts数组(此文本的纯文本)是'由应用程序提供的字体')
  • 此时,我建议添加此临时调试代码块以转储应用程序可访问的所有字体,包括新添加的your_new_font:
for(NSString *fontfamilyname in [UIFont familyNames])
{
    NSLog(@"family:'%@'",fontfamilyname);
    for(NSString *fontName in [UIFont fontNamesForFamilyName:fontfamilyname])
    {
        NSLog(@"\tfont:'%@'",fontName);
    }
    NSLog(@"-------------");
}
  • 在调试输出中,查找新字体的“family”和“font”名称。将显示为与您的新字体系列对应的“字体”名称(可能有多个与您的新字体“系列”关联的“字体”)传递给UIFont *myNewFont = [UIFont fontWithName:@"font_name_from_debug_output" size:20],您应该开始营业!

答案 2 :(得分:38)

  • 安装字体
  • 在Mac上打开字体图书应用
  • 选择字体并点击&#39; info&#39;按钮
  • 您正在寻找的名称是 PostScript名称

example

答案 3 :(得分:32)

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

  

想象一下你自己重命名字体文件&#34; Arial-regular.ttf&#34;成为   &#34; foo.ttf&#34 ;.您刚刚重命名的字体文件中包含的字体仍然是   &#34; Arial字体正规&#34;

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

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

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

以下是在我的~/Library/Fonts目录上运行的上述命令的屏幕截图:

enter image description here

上面的脚本将运行当前目录中的所有.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

enter image description here

这比AppDelegate.m文件中的复制粘贴代码快一点,以便在每次要添加新字体文件时打印出名称,这是一种流行的方法,并且它也更快而不是打开FontBook中的字体来检查PostScript名称。

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

希望这有帮助!

答案 4 :(得分: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 :(得分:5)

Swift 3.0

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

答案 6 :(得分:4)

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

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

答案 7 :(得分:3)

Swift 1.2:

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

答案 8 :(得分:3)

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

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
}

根据需要替换您自己的throwable Error对象。

答案 9 :(得分:3)

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

答案 10 :(得分:2)

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

答案 11 :(得分:1)

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

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

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

希望它对你有所帮助。

答案 12 :(得分:1)

另一个&#34;快速,实用&#34;黑客并不涉及扫描模拟器或设备上存在的所有默认字体,而是使用字体来处理故事板中的某些内容。然后,如果使用文本编辑器编辑故事板,则可以看到与&#34;内部&#34;一起使用的字体。如果您搜索&#34; customFonts&#34;标记:

<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 :(得分:0)

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

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

答案 14 :(得分:-1)

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