【问题标题】:Xcode 8 custom font doesn't show up in interface builderXcode 8 自定义字体未显示在界面生成器中
【发布时间】:2017-03-03 06:36:02
【问题描述】:

我正在尝试在我的 iOS 应用程序中使用自定义字体 (Bebas Neue)。我采取的步骤是:

  1. 将 .otf 文件复制到项目中。
  2. 确认 .otf 文件已将项目设置为目标。
  3. 在 plist 的“应用程序提供的字体”中添加了 .otf 文件。
  4. 在构建阶段,.otf 文件位于“复制捆绑资源”中。
  5. 在我的 Mac 上安装字体。
  6. 尝试打印出所有可用字体,但我看不到自定义字体。

我使用的代码:

for name in UIFont.familyNames() {
  println(name)
  if let nameString = name as? String
  {
    println(UIFont.fontNamesForFamilyName(nameString))
  }
}
  1. 尝试在代码中设置字体并且成功了。

我使用的代码:

textLabel?.font = UIFont(name: "BebasNeueRegular", size: 14)
  1. 但我无法在界面生成器中进行设置。有什么想法吗?

截图:

【问题讨论】:

  • 有一种简单的方法可以检查您的自定义字体是否可用于您的项目。只需将 UILabel 放入您的 mainStroryBoard。选择标签并转到字体管理器选择自定义并检查字体列表中列出的自定义字体。如果列表中列出了您的自定义字体,那么您的项目可用的字体。如果没有,那么您的字体导入有问题。我建议您导入为您的项目添加更多字体(otf 和 ttf),看看效果如何......
  • 如果您仍有问题。发布您的 plist 的屏幕截图。您的 plist 很可能是罪魁祸首……
  • @Joe 感谢您的回复。我试图放置一个 UILabel 并在字体中选择自定义,但我找不到我的自定义字体。我试过使用其他字体,我可以在界面生成器中看到其他字体。也许这个字体有问题(Bebas Neue)?
  • 我知道你的问题是你在导入 viseversa 后更改了字体名称。你能用你当前的字体名称 textLabel 更新这一行吗?.font = UIFont(name: "FontName", size: 14)
  • textLabel?.font = UIFont(名称:“BebasNeue”,大小:14)。试试这个,它应该可以工作,你的 plist 字体名称应该像这样 BebasNeue.otf

标签: ios swift xcode custom-font


【解决方案1】:

尝试以下步骤:Swift 3 中测试的代码。

第 1 步:将您的自定义字体添加到您的项目中(确保 添加到目标 打勾)。我使用“PermanentMarker.ttf”、“Pecita.otf”和“AROLY.ttf”字体作为测试字体。

注意:支持字体类型ttfotf(两种字体都可以使用)

第二步:修改application-info.plist文件。 在新行中添加键“应用程序提供的字体”,并在数组“应用程序提供的字体”中添加“PermanentMarker.ttf”作为新项。

您的 plist 应如下所示

现在该字体将在 Interface Builder 中可用。要在代码中使用自定义字体,我们需要通过名称引用它,但名称通常与字体的文件名不同

现在,您可以从 viewController 访问自定义字体。我正在通过将 UIlabel 放置到 Storyboard 来测试字体,如下所示。

更新 2: Working Solution

之后,导入您的自定义字体并从您的storyBoard 更新您的plist.selectlabel,转到Attributes InspectorLabel>Text type> 选择Attributed 并选择您的custom font从列表中。

输出:

更新 1

如果您的自定义字体仍未在Xcode font list 中列出。请检查您的问题的相关链接

注意:不过,您可以通过编程方式将BebasNeuecustom font 分配给您的标签或按钮等,即使它没有显示在您的interface Builder 中。如果您在为您的字体设置字体时遇到问题以编程方式创建对象。试试下面的方法。

为 UILabel 分配字体:

    label?.font = UIFont(name: "BebasNeue", size: 35) // Set to any size

为 UIButton 分配字体:

    button.titleLabel?.font = UIFont(name: "BebasNeue", size: 35)

为 UITextField 分配字体:

    textField.font = UIFont(name: "BebasNeue", size: 25) 

为 UINavigationBar 分配字体:

    navigationController?.navigationBar.titleTextAttributes = [NSFontAttributeName: UIFont(name: "BebasNeue", size: 25)!, NSForegroundColorAttributeName: UIColor.red]

为 UIToolBar 分配字体:

    UIBarButtonItem.appearance().setTitleTextAttributes([NSFontAttributeName: UIFont(name: "BebasNeue", size: 25.0)!], for: UIControlState.normal)

输出:

【讨论】:

  • 感谢您的回答,您可以使用 BebasNeue 进行测试吗?因为我可以让它在界面生成器中使用其他字体,但不是这个。
  • update 2 解决方案终于对我有用了!谢谢乔!!
  • 我也有同样的问题。 BebasNeue 字体仅支持属性文本显示。
【解决方案2】:

也许文件夹名和字体名有区别,解决办法是:

  • 打印所有默认字体名称。(不含自定义字体)
  • 为项目添加自定义字体。
  • 打印所有字体名称。

然后比较字体名称。

func printFontsNames() {
    let fontFamilyNames = UIFont.familyNames
    for familyName in fontFamilyNames {
        print("------------------------------")
        print("Font Family Name = [\(familyName)]")
        let names = UIFont.fontNames(forFamilyName: familyName )
        print("Font Names = [\(names)]")
    }
}

【讨论】:

    【解决方案3】:

    自 Xcode 3.x 以来它是一个old bug

    在使用非标准字体和 Interface Builder 的 XCode 3.x 上存在一个错误/已知问题。自定义字体通常需要以编程方式设置(通过 [UIFont fontWithName:])

    有一些解决方法,例如 thisUser Defined Runtime Attributecategories

    【讨论】:

      【解决方案4】:

      当使用相同的字体 (Bebas Neue) 时,我遇到了完全相同的问题:字体未显示在 Plain 控件的字体列表中。

      它适用于 Attributed 控件,如 Joes 帖子中的更新 2 中所述,但实际上您更改的是 attributedText 而不是常规的 text,这可能会导致不需要的行为。例如,您必须在运行时使用 NSMutableAttributedString 来更改文本或文本颜色。

      我对这个问题做了一些调查。我用FontLab Studio 修改了字体并做了一些测试。我用Bebas Neue version 1.400 (dated September 15, 2014) from dafont.com

      • 字体文件可能以某种方式损坏。重新保存为 .otf 和 .ttf:无效。
      • 字体的元数据可能已损坏。将所有字形复制到新字体并命名为 Bebas Neue:不起作用。
      • 我将字体从 Bebas Neue 重命名为 BN:有效!但为什么呢?
      • 也许您不能在字体名称中使用“Neue”(因为 Helvetica Neue 是 iOS 8 之前的 iOS 系统字体)。将字体重命名为 Test Neue:仍然有效。
      • 也许您不能在字体名称中使用“Bebas”?将字体重命名为 Bebas:仍然有效。
      • 什么...为了确定一下,我将字体名称改回 Bebas Neue:不再起作用了。
      • 我也试过 BebasNeue:也没用。
      • 然后我把名字改成了 Bebas Neue 不管怎样:它有效。

      我真的不明白为什么会这样。 Apple 或 Xcode 不希望您在 Interface Builder 中使用“Bebas Neue”或“BebasNeue”吗? 我安装了普通的 Bebas Neue。也许参考已损坏? 我真的说不出来。如果 Bebas Neue 在他们的 Xcode 中工作,也许有人在干净的系统上可以尝试。

      无论如何,我实现了我的目标:能够将 Bebas Neue(我将最终版本命名为“Bebas Neue MyAppName”)用于Plain 样式的标签和按钮,因此我可以按原样设计我的应用程序,而不是必须摆弄属性字符串。

      【讨论】:

      • 对我来说同样的解决方案。看起来 Xcode 不喜欢字体名称,直到我更改它的 FullName 元数据
      • 您如何更改名称?我对这种特定字体也有同样的问题。
      • 由于 Bebas Neue 是在允许免费再分发的 SIL 开放字体许可证下获得许可的,所以我上传了一个预先重命名的版本,您可以在这里下载:ge.tt/14SV3fj2 祝你好运!
      • 谢谢,这个解决方案对我有用。我使用了一个名为 FontForge 的免费程序来更改全名元数据(改为“BebasFixNeue”):fontforge.github.io/en-US
      • 感谢@Flitskikker 太好了!!!,您提供的字体对我有用。您能否为 BebasNeue-Bold、BebasNeue-Thin 和 BebasNeue-Light 提供重命名的字体?
      【解决方案5】:

      您实际上可以只进入属性字体,单击自定义字体窗口。单击左上角的齿轮,然后单击选项管理字体。应该会弹出一个窗口并在顶部,并且应该有一个加号以允许您添加字体。只需选择您下载的自定义字体,如 xyz.tff,然后应该添加它。

      需要注意的是 ttf 文件应该在 p-list 以及您的项目目录中引用!

      【讨论】:

      • 其实不远了。该字体可以安装在应用程序中,但不能安装在您的系统上。对我来说,将字体安装到 Apple 的字体册中可以解决问题。
      【解决方案6】:

      我有类似的问题

      添加了自定义字体并将其分配给UILabel 一切正常,但几次后它不会按预期工作。

      尝试所有解决方案,但对我没有任何帮助。所以这是我的解决方案,再次转到之前的UILabel(已经有新添加的自定义字体)选择->标签->选择新添加的字体。检查其他 UI 控件的字体。

      现在一切正常。

      希望这对新开发者有帮助...

      【讨论】:

        【解决方案7】:

        现在简单易用 - 在 Xcode 10 和 swift 5 中测试

        将字体添加到 Xcode 的步骤

        在字体部分选择您的 UILabel、UITextField 或其他任何内容并关注

        第 1 步

        从字体选择屏幕的左角选择设置菜单。并选择字体管理器选项。

        第 2 步

        点击下面标记的添加按钮。

        第 3 步

        选择包含您的字体的文件夹。它将被加载到 XCode 字体列表中。

        向项目添加字体的步骤

        不要忘记使用 Fonts provided by application 键向您的 plist 添加描述,并将字体文件放在项目目标设置下的复制包资源中。

        是的!就是这样..njoy..

        【讨论】:

        • 是的,就是这样。我能够在项目中包含和使用该字体,但该字体未出现在界面构建器中。原来 xcode 从系统中读取字体列表确实是有意义的。注意:对于遇到此问题的任何人,请记住将字体正确包含到您的项目中,否则它将无法在没有安装上述字体的计算机上运行。
        • 我通过打开 Font Book 应用程序,然后从“用户”部分删除字体,最后将字体文件拖到“计算机”部分解决了这个问题(这需要重新启动 Xcode)。跨度>
        • 当项目安装在其他人的 mac 上时会发生什么,而这些自定义字体没有安装?
        【解决方案8】:

        最后,我找到了 Bebas Neue 字体问题的根本原因

        我不记得我在哪里下载了字体,但 Bebas Neue 字体不一致

        下载即应用名为Typelight

        打开不是Regular,而是使用TypelightBold字体。

        您需要纠正大多数 Bebas Neue 字体。

        【讨论】:

        • 为此浪费了很多时间,感谢您的发帖:) 我认为字体本身不是问题。
        • 谢谢,这有帮助!事实上,我注意到姓氏中包含“Neue”这个词会导致问题,因此只需将姓氏重命名为“Bebas”就足够了。
        • 我可以确认将字体重命名为 Bebas 就足够了。
        【解决方案9】:

        这对我来说在 Swift 4.2 中仍然是一个反复出现的问题,即使没有进行任何会导致它的更改。

        从 Xcode 项目中删除字体文件并再次添加它们可以解决问题(直到下一次)。

        【讨论】:

          【解决方案10】:

          在我的例子中,Interface builder 中缺少一个字体系列,因为该系列中的一种字体没有添加到项目中,而是在 info.plist 文件中指出。

          通常从项目中删除我所有的自定义字体并再次添加它们 - 修复了问题。

          【讨论】:

            【解决方案11】:

            在这里潜伏了好久。我刚刚创建了一个帐户,所以我可以帮助某人解决这个问题。这非常令人沮丧,我刚刚接受了大手术来修复它。你不想重复我刚刚经历的事情。

            TLDR

            在完成以下我执行的所有步骤之前,在 Mac OS 中创建一个新用户帐户,看看您是否能够在新帐户中取得成功。事后看来,我可能只需执行第 7 步和第 11 步,就可以省去几个小时的麻烦。

            问题

            在不情愿地从 Mojave 升级到 Catalina 以便我可以运行最新版本而非最佳版本的 Xcode (11.5) 之后,我不再能够从界面生成器中的 PLAIN 文本控件的字体选择器中选择自定义字体。

            正如其他人所提到的,属性文本工作正常,因为它使用系统字体选择器而不是“黑匣子/这些字体来自哪里???”使用纯文本时出现的选择器。

            失败的步骤

            我尝试了以下步骤但没有成功:

            1. 将字体文件重新添加到项目中,希望 Xcode 能够修复 选择器从中加载的字体表的链接(仍然 不知道为什么选择器中有某些字体以及它在哪里 正在获取它们)。
            2. 使用几个终端命令重置 Mac OS 字体缓存,希望选择器从 OS 中损坏的字体缓存加载列表
            3. 在 Font Book 应用中选择 File > Restore Standard Fonts 来重置系统字体
            4. 对着电脑大喊大叫,诅咒苹果变成了这样
            5. 尝试在操作系统中安装字体以查看是否可以解决任何问题,因为我记得几年前遇到类似问题时它可以工作。
            6. 在互联网上搜索任何线索,并尝试了几乎所有看似合理的方法。
            7. 创建了一个全新的简单项目...仍然无法选择自定义字体...呃哦

            带上大炮

            1. 诅咒自己没有执行 Catalina 的 CLEAN 安装,并决定从头开始重新安装 Catalina。
            2. 意识到我在重新安装之前使用 Time Machine 备份数据时犯了一个错误,因为它不会让我只带入我的数据文件。迁移助手需要导入库数据(恢复时选项变灰),我不想这样做......再次诅咒苹果和我自己,因为我知道这会咬我......正如我所怀疑的那样配置文件中有垃圾导致此问题(我是对的......见下文)
            3. 在迁移助手的 IMPORTED 帐户下运行时尝试在 Xcode 中选择字体...同样的问题...无法选择自定义字体

            成功!!!

            1. 创建了一个新用户并在该帐户下创建了一个新的简单项目。答对了!!!我现在可以选择字体了!!!诅咒苹果,又对着电脑大喊大叫……不知何故,我的用户帐户在升级到 Catalina 时损坏了

            【讨论】:

              猜你喜欢
              • 1970-01-01
              • 1970-01-01
              • 2015-06-24
              • 2011-05-16
              • 1970-01-01
              • 2015-09-22
              • 2015-12-21
              • 1970-01-01
              • 2017-02-11
              相关资源
              最近更新 更多