如何在Mac应用程序中使用自定义字体?

22

我试图在我的 Swift 应用程序中使用自定义字体,但它们没有加载。

我将 fonts.ttf 文件复制到资源文件夹中,并在 Info.plist 的“应用提供的字体”键下添加了字体名称。

我也尝试使用 .plist 中的“应用程序字体资源路径”键,但没有结果。这是我用来应用我的字体的代码。我已经尝试过使用:“MyFont.ttf”和“MyFont”。

@IBOutlet weak var label:NSTextField!

override func awakeFromNib() {
    label.font = NSFont(name: "MyFont.ttf", size: 15)
}

从另一个SO答案中(抱歉现在找不到了):可以通过在Font Book中打开字体并使用显示在检查器窗格中的PostScript名称旁边的字符串来找到名称字符串。 - Todd
6个回答

33

在XCode 7.3.1中,“应用字体资源路径”现在是字符串类型,我找不到一种使用数组来使用多个字体的方法,因此我在Info.plist中使用了“。”:

     Application fonts resource path     String    .

这似乎可以动态地从资源文件夹中获取我所有的自定义字体,例如使用 Swift。

 labelText.font = NSFont(name: "DS-Digital", size: 48)

然而,要在XCode设计模式下查看它(从下拉菜单中选择字体),我需要先将字体添加到字体册中。

不过,使用动态方法并不需要使用字体册 :)


这个解决方案救了我一命!!谢谢。 - Silviu St
还发现如果您将字体放入一个文件夹中,比如说“Fonts”,您可以使用“Fonts”作为字符串值。 - R0CKSTAR
太不可思议了!只需要一个点就省下了我的时间!谢谢你,你真是太棒了! - Genevios
使用一个点号 . 对我有效。 - Patrick
不错的尝试,难怪我在界面构建器的下拉菜单中找不到字体,因为我没有将字体安装到字体册中。 - tounaobun

16

ATSApplicationFontsPath 用于 macOS :

ATSApplicationFontsPath (String - macOS) 表示 bundle 的 Resources 目录中包含字体文件或字体目录的位置。 如果存在,macOS 会激活指定路径下的字体供捆绑在应用程序中使用。这些字体仅对应用程序生效,而不是整个系统。路径本身应指定为 bundle 的 Resources 目录的相对目录。例如,如果一个字体目录位于路径 /Applications/MyApp.app/Contents/Resources/Stuff/MyFonts/,则应将该键的值设置为 Stuff/MyFonts/。

macOS 应用程序说明:

  1. 项目导航器 中选择 Xcode 项目
  2. 选择您的应用程序 目标
  3. 单击 + 按钮 并添加一个新的复制文件阶段
  4. 对于 目的地,选择资源
  5. 子路径 下指定内嵌字体将被复制到的目录(例如 Fonts),该目录位于应用程序包的 Resources 目录中。
  • 将字体文件拖放到“复制文件”构建阶段的文件列表中。
  • UIAppFonts 用于iOS:

     

    UIAppFontsArray - iOS)指定应通过正常机制提供的任何应用程序提供的字体。 数组中的每个项都是一个字符串,其中包含位于应用程序捆绑包中的字体文件的名称(包括文件名扩展名)。 当运行该应用程序时,系统会加载指定的字体并使它们可供应用程序使用。

     

    该键在iOS 3.2及更高版本中受支持。


    我已经尝试了几乎所有的方法,这是在Mac OS上真正有效的解决方案。而且它也是最简单的解决方案。 - Mec Os

    8
    通过直接将应用程序字体资源路径设置为我的字体文件名称,我仅凭运气解决了这个问题。 1

    2
    我只是将其留空,然后它就起作用了:<key>ATSApplicationFontsPath</key><string></string> 我的字体位于资源根文件夹中。 - CiNN

    7

    对于那些字体家族名为My-Custom-Font-Family的人:请注意,在代码中,您应该像这样实例化自定义字体:NSFont(name: "MyCustomFontFamily-Bold", size: 20)。空格和“ - ”会被忽略,字体类型写在“ - ”后面。我没有在任何文档中看到这一点,并花了几个小时试图弄清楚出了什么问题。此外,如果您想获取所有可用字体的列表,可以使用以下代码。

    for font in NSFontManager.shared.availableFonts {
        print(font)
    }
    

    我有MyFont-Bold.tff,应该如何实例化它? - ArdentLearner
    @ArdentLearner 就像我之前提到的一样:NSFont(name: "MyFont-Bold", size: 20) - Mike.P

    5
    首先将所需嵌入到您的OSX应用程序中的字体添加到您的项目中:
    然后点击“项目”-> “信息”,然后点击加号并添加一个新的键“Application fonts resource path”,在那里输入您的字体名称,创建一个字符串数组:
    现在您可以选择自定义字体,并显示字体名称,但仍需要使用Font Book在Xcode中可用。

    1
    我觉得我要疯了!我按照你说的做了,但是什么也没有发生。添加的字体在字体列表中不存在。 - C-Viorel
    你能给我发送字体链接吗?问题可能出在所选的字体上。你尝试过使用另一种字体吗? - Leo Dabus
    4
    应用程序字体资源路径是一个字符串类型,我无法添加字符串数组。 - Myat Min Soe
    3
    你好,如果应用程序字体资源路径是一个字符串而不是一个数组,我无法像您在图像中那样添加字体。 - stan liu
    4
    对我来说,问题就在于字体必须在系统(即Font Book)中安装好后才能嵌入应用程序。这似乎很荒谬,但我猜想这是为了让你可以在界面构建器中使用它,即使你只是在代码中创建字体,它也需要最初安装在Font Book中,然后您可以在需要时将其删除。苹果在如何在应用程序中嵌入字体的页面上没有提到任何这些内容,因此非常令人困惑。另外,在macOS中,我正在使用“Fonts Provided By Application”而不是“Application fonts resource path”的plist键。 - Ben Stahl
    显示剩余8条评论

    1

    尝试从界面构建器中,在属性检查器中进行此操作。


    从IB中,我只能访问已安装的系统字体。我想要加载自己的字体。 - C-Viorel
    1
    在IB中,属性检查器(字体行)点击“T”,然后点击字体再点自定义。如果你想使用特定字体(比如MyFont),首先需要将其加载到OS X的字体册中,然后才能选择它。对我的糟糕英语感到抱歉。 - Name
    但这只解决了我的问题。如果我在FontBook中安装了一个.ttf字体,那么我可以很容易地使用它,但是,每个使用我的应用程序的用户都需要安装该字体,而且我非常确定一件事:用户很懒。 - C-Viorel
    1
    首先,您需要将字体放入项目中,并在info.plist中使用ATSApplicationFontsPath键。更多信息请参见https://developer.apple.com/library/mac/documentation/General/Reference/InfoPlistKeyReference/Articles/GeneralPurposeKeys.html。 - Name
    应用字体资源路径是ATSApplicationFontsPath的新键名,所以我已经更改了,但是有可能出现错误。 - C-Viorel
    显示剩余2条评论

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