【问题标题】:UIFont with custom font fails with Nil带有自定义字体的 UIFont 因 Nil 而失败
【发布时间】:2012-02-21 06:21:21
【问题描述】:

我正在尝试在 Xcode 4.2 中将自定义字体添加到我的项目中,但每当我尝试使用它时,我都会收到一个错误,即对象为 nil。

我做了以下事情:
1) 在我的 .plist '应用程序提供的字体' 值中添加了一行:“LCDMono2 Ultra.ttf”
2) 将字体添加到我的支持文件中并在 XCode 中显示以验证它是否已添加。
3) 使用 Get Info 验证全名是“LCDMono2 Ultra”
4) 在我的项目中创建字体:

UIFont *myFont = [UIFont fontWithName:@"LCDMono2 Ultra" size:16];

我已经尝试过这个变种:

UIFont *myFont = [UIFont fontWithName:@"LCDMono2 Ultra" size:16.f];

5) 尝试使用字体名称(addObject:myFont.fontName),产生'nil' 错误。

什么可能导致错误?会不会是名字中的空格之类的东西?

【问题讨论】:

  • 使用[UIFont familyNames] 查看您的字体是否真正被操作系统“看到”。这至少会缩小范围。我有一些 iOS 无法识别的字体文件。
  • @smparkes - 在我阅读您的回复之前,我只是这样做了!果然,Xcode 会自动删除空格,并且名称显示为“LCDMono2Ultra”并且可以正常工作。不总是这样吗?谢谢。
  • 可能不是 Xcode。这可能是字体名称在字体文件中的编码方式。一点无偿的提示:iOS 只允许您从一个家庭加载两个面孔,因此如果您使用来自一个家庭的两个以上的面孔,您需要将每个面孔上的姓氏更改为唯一的。这需要一段时间才能找到......

标签: iphone objective-c uifont custom-font


【解决方案1】:

您是否设置了断点并检查您是否为 myFont 获取了有效的 UIFont 对象。这是值得检查的,因为问题很可能是“LCDMono2 Ultra”实际上是字体系列名称,而您想要使用的是“LCDMono2 Ultra-normal”或“LCDMono2 Ultra-bold”之类的东西。使用 Font Book 打开您的 .ttf 并查看它为您提供的信息。

或者,如果您在 Font Book 中找不到任何内容,您可以尝试调用:

NSArray *fonts = [UIFont fontNamesForFamilyName:"LCDMono2 Ultra"];

然后在调试器中打印数组字体以检查它们应该是什么。

希望对您有所帮助,如果这不起作用,请告诉我,我会尝试其他方法:)

【讨论】:

  • 谢谢,但我找到了解决方案 - 请参阅上面的评论。
【解决方案2】:

字体全名中的空格在添加到项目后被自动删除。我检查了原始字体文件,空格在那里,所以Apple一定不想处理空格。我更改了对“LCDMono2Ultra”的引用,它可以工作。

【讨论】:

  • 这不是“不想处理空格”,我相信它使用的是字体的 PostScript 名称。
  • 大卫邓纳姆是正确的。通常,如果您要在代码中实际硬编码字体名称,则应始终使用完整的 PostScript 名称来引用该字体。 (不允许使用空格的是 PostScript 名称本身)。如果您不确定它是什么,请在 Mac 上使用 Font Book 安装该字体,然后在 Font Book 中选择 Preview > Show Font Info 以显示各种名称,包括 PostScript 名称。 “LCDMono2 Ultra”的 PostScript 名称是 LCDMono2Ultra
  • 是的,你是对的。我没有在我的系统上安装字体,所以我无法从字体书中获取该信息。安装后,我可以看到 Postscript 名称。谢谢。
  • 谢谢 - 无法理解这里发生了什么。有系统字体,但 iOS 正在寻找不带空格的字符串。
【解决方案3】:

我在几个小时内遇到了同样的问题,并尝试了以上所有方法,但都没有奏效,字体被添加到应该在的任何地方,我什至尝试了在其他应用程序中有效的字体,但似乎从未添加到这个应用程序。

Xcode 5 中似乎发生了一些变化,必须将字体添加到 info 选项卡下的目标属性中才能正常工作,而之前它们必须添加到“appName-info.plist”中,见下图:

希望这对其他人有所帮助。

【讨论】:

  • 重要:添加整个文件名,带扩展名。
【解决方案4】:

找到你的字体(也许用另一个名字)并使用这个名字。

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

【讨论】:

    【解决方案5】:

    我的字体文件是“Futura Heavy.ttf”,然后我用-替换下面的空格就可以了!

        class func futuraHeavy() -> UIFont {
            return UIFont(name: "Futura-Heavy", size: 12)!
        }
    

    【讨论】:

      【解决方案6】:

      确保在 plist“应用程序提供的字体”中包含字体的文件扩展名作为名称的一部分。

      【讨论】:

        【解决方案7】:

        在我的例子中,我需要从字体名称中删除所有额外的连字符,除了字体粗细之前的那个:

            UIFont(name: "SF-Pro-Display-Semibold", size: 15) // fails
            UIFont(name: "SFProDisplay-Semibold", size: 15) // succeeds
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2019-05-31
          • 1970-01-01
          • 2014-04-03
          • 1970-01-01
          • 2020-02-08
          • 1970-01-01
          • 1970-01-01
          • 2019-03-02
          相关资源
          最近更新 更多