自定义字体的UIFont失败,返回Nil。

12

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

我已经完成以下操作:
1) 添加了一行到我的.plist文件中的“应用程序提供的字体”值:“LCDMono2 Ultra.ttf”
2) 将字体添加到我的Supporting Files,并在XCode中显示以验证是否已添加。
3) 使用“获取信息”验证全名为“LCDMono2 Ultra”
4) 在我的项目中创建了该字体:

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

而且我已经尝试了这个变体:

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

尝试使用字体名称 (addObject:myFont.fontName) 时,出现了 'nil' 错误。

是什么导致了这个错误?可能是名称中的空格之类的问题吗?


3
使用[UIFont familyNames]查看你的字体是否被操作系统实际“看到”。这样至少可以缩小问题范围。我曾经遇到过一些iOS无法识别的字体文件。 - smparkes
@smparkes - 在看到你的回复之前,我刚刚做了这件事!果然,Xcode会自动删除空格,名称显示为“LCDMono2Ultra”,并且可以正常工作。这不总是这样吗?谢谢。 - wayneh
1
可能不是Xcode的问题。很可能是字体名称在字体文件中的编码方式。一个小小的提示:iOS只允许从一个字体家族中加载两个字体,所以如果你使用了一个家族中的超过两个字体,你需要将每个字体的家族名称更改为唯一的。这花费了一些时间来追踪... - smparkes
7个回答

15

将字体的全名添加到项目后,空格会自动删除。我检查了原始的字体文件,确实有空格,所以苹果可能不想处理空格。我将引用更改为“LCDMono2Ultra”,它可以工作。


4
这句话的意思是:这不是“不想处理空格”的问题,我认为这是使用字体的PostScript名称。 - David Dunham
5
David Dunham 是正确的。一般来说,如果您要在代码中实际硬编码字体名称,您应该始终使用完整的 PostScript 名称来引用字体。(正是 PostScript 名称本身不允许有空格)。如果您不确定字体的名称,可以使用 Font Book 在 Mac 上安装该字体,然后在 Font Book 中选择“预览 > 显示字体信息”以显示各种名称,包括 PostScript 名称。 "LCDMono2 Ultra" 的 PostScript 名称是 LCDMono2Ultra - NSGod
是的,你说得对。我没有在我的系统上安装这个字体,所以我无法从字体册中获取那些信息。一旦我安装了它,我就可以看到Postscript名称了。谢谢。 - wayneh
谢谢 - 我无法理解这里发生了什么。系统字体存在,但iOS在查找没有空格的字符串。 - Allen

13

我也遇到了同样的问题几个小时,试了上面所有方法都没用,字体应该已经被添加到了正确的位置,甚至尝试了在其他应用程序中能用的字体,但是它们似乎从未被添加到这个应用程序中。

看起来在Xcode 5中有些改变了,字体必须在目标属性的信息选项卡下添加才能正常工作,而以前它们必须在“appName-info.plist”中添加,如下图所示:

图片描述

希望这可以帮助其他人解决问题。


重要提示:请添加完整的文件名,包括扩展名。 - Ivan Mir

3

在我的情况下,我需要从字体名称中删除所有额外的连字符,除了紧挨着字体重量之前的那一个:

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

2

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

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

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

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

希望这可以帮到您,如果这不起作用,我会尝试想出其他办法:)


谢谢,但我已经找到解决方案了 - 请看我上面的评论。 - wayneh

2
找到你的字体(也许是另一个名称),使用这个名称。
    for (NSString *familyName in [UIFont familyNames]) {
        for (NSString *fontName in [UIFont fontNamesForFamilyName:familyName]) {
            NSLog(@"%@", fontName);
        }
    }

1

我的字体文件是"Futura Heavy.ttf",然后我使用-替换空格,像下面这样就可以了!

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

0

在 plist 的 "Fonts provided by application" 中,一定要将字体的文件扩展名包含在名称中。


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