使用 Swift 向 macOS 应用程序添加自定义字体

Adding a custom font to macOS app using Swift

我遵循了很多教程,但它不起作用:我只是想将自定义字体添加到 macOS 应用程序。

我主要尝试的是:

  1. .ttf 字体文件添加到我的项目:目标成员已设置,我还确保使用 Copy Files 复制文件Bundle Phases。编译后我可以看到所有文件都在 Bundle 中。所以这似乎工作得很好。

  1. Info.plist:我 添加了 Fonts provided by application 并为我要添加的每个字体文件创建了一个项目(值如 myFont.tff).

  2. 我确定我使用了正确的字体名称。我在我的系统上安装了字体,并使用 Interface Builder 配置了一个标签,以便它使用所需的字体。我打印了它的值 print(myLabel.font.fontName).

  3. 令人困惑:如果我要添加到应用程序的完全相同字体文件已安装在系统字体簿中并已激活,则一切正常。当我停用它时,它不起作用。对我来说,这表明我使用了正确的字体名称。

  4. 我找到了 ATSApplicationFontsPath 并尝试 将其添加到 Info.plist,但都没有使用路径(文档推荐) 或像 . 这样的值(这似乎对那里的某些人有用)。

感谢任何帮助!

ATSApplicationFontsPath(即 Application fonts resource path)是相对于您的应用程序包的 Resources 文件夹的。

要查看您的字体被复制到哪里:

  1. 在 Xcode 中,展开 Project Navigator 下的 Products 部分,然后单击 Show in Finder

  1. 在 Finder 中,Ctrl-click 在您的应用上,然后单击显示资源内容。浏览至 Resources 文件夹并在其中找到您的字体。

我偶然解决了我的问题。

我注意到在 Bundle 文件中,我的字体被包含了两次:它们被复制到 "Resources" 目录以及我在 "Copy Files" Build Phases 中声明的子路径。 我从我的项目中删除了字体,再次添加它们(不检查 "Target Membership")并将它们添加到构建阶段,以便将它们复制到子路径。之后就成功了。

补充说明:

原来 Fonts provided by application 只是 iOS 属性,因此 macOS 实现不需要它。

此外,ATSApplicationFontsPath 不需要任何斜线。例如:Fonts 应该可以正常工作。

我很难找到 .ttf 字体文件的正确名称,有时会发现一些奇怪的行为:NSFont 从字体系列中随机选择字体(常规、中等、粗体...),而没有任何代码更改。通过使用 .otf 文件,我也可以解决这个问题。

根据以前的答案,我很难让它发挥作用,所以我决定自己写一个答案。这是基于@ixany 和@rob-keniger 之前的回答。

  1. 创建一个名为 Fonts 的文件夹

  1. 将字体添加到 Fonts 文件夹。取消选中 Add to targets 并选中 Copy items if needed.

  1. Application fonts resource path添加到Info.plist并输入Fonts

  1. 转到 Build Phases 并创建一个 New Copy Files Phase

  1. Destinations 设置为 Resources,将 Subpath 设置为 Fonts。然后将您的字体文件添加到列表中。

None 以上在 Xcode 12 beta 1 运行 BigSur 中对我有用,但这些步骤确实有效。

  1. 为组织创建字体文件夹。
  2. 将您的字体添加到项目中。请务必检查 macOS 目标!
  3. 将应用程序字体资源路径设置为“.” (没有引号)。

无需编辑构建阶段或其他任何东西。

Xcode 12 要添加自定义字体,您必须从提供的字符串中排除扩展名。

.font(.custom("your font name", size:xx)) // 每次都有效

.font(.custom("your font name.extension",size:xx)) // 总是失败

与 Xcode 不同 11.xx 字体 name.extension 正在工作。