UIFont fontWithName返回nil

时间:2012-04-21 00:35:23

标签: objective-c ios cocoa-touch uifont

在我的info.plist中,我添加了一个键“应用程序提供的字体”并添加了EdwardianScriptITCStd.otf enter image description here

但是,当我尝试获取该字体时,它返回nil:

NSLog(@"%@", [UIFont fontWithName:@"EdwardianScriptITCStd" 
                                size:16.0f]);

我使用[UIFont familyNames]打印了字体系列,但它不存在:

(
    Thonburi,
    "Snell Roundhand",
    "Academy Engraved LET",
    "Marker Felt",
    "Geeza Pro",
    "Arial Rounded MT Bold",
    "Trebuchet MS",
    Arial,
    Marion,
    "Gurmukhi MN",
    "Malayalam Sangam MN",
    "Bradley Hand",
    "Kannada Sangam MN",
    "Bodoni 72 Oldstyle",
    Cochin,
    "Sinhala Sangam MN",
    "Hiragino Kaku Gothic ProN",
    Papyrus,
    Verdana,
    "Zapf Dingbats",
    Courier,
    "Hoefler Text",
    "Euphemia UCAS",
    Helvetica,
    "Hiragino Mincho ProN",
    "Bodoni Ornaments",
    "Apple Color Emoji",
    Optima,
    "Gujarati Sangam MN",
    "Devanagari Sangam MN",
    "Times New Roman",
    Kailasa,
    "Telugu Sangam MN",
    "Heiti SC",
    "Apple SD Gothic Neo",
    Futura,
    "Bodoni 72",
    Baskerville,
    "Chalkboard SE",
    "Heiti TC",
    Copperplate,
    "Party LET",
    "American Typewriter",
    "Bangla Sangam MN",
    Noteworthy,
    Zapfino,
    "Tamil Sangam MN",
    "DB LCD Temp",
    "Arial Hebrew",
    Chalkduster,
    Georgia,
    "Helvetica Neue",
    "Gill Sans",
    Palatino,
    "Courier New",
    "Oriya Sangam MN",
    Didot,
    "Bodoni 72 Smallcaps"
)

我错过了什么? 谢谢!

6 个答案:

答案 0 :(得分:78)

我的评论开始变得冗长,所以我决定提交答案:)

  1. 自定义字体仅在iOS 3.2及更高版本中受支持,因此请确保您的部署目标构建设置不会再回溯到版本3.2。

  2. 验证字体是否包含在构建目标中(在“复制捆绑资源”构建阶段)

  3. 检查“应用程序提供的字体”键的原始值,以确保其正确无误。在Xcode中查看* .plist时,右键单击并选择“显示原始键/值”,然后验证密钥为UIAppFonts

  4. 我认为iOS在使用fontWithName: size:时需要字体的PostScript名称,您可以通过在Apple的字体簿中打开字体并键入command+I来查找/验证。

  5. 有一点,使用自定义字体和UILabel时出现问题。我不确定这个问题是否仍然存在。解决方案是子类UILabel并在其中设置字体。

  6. 如果它仍然不起作用,this Stack Overflow thread on custom fonts有相当多的信息,你可能会有一些运气。

    修改
    我无法保证我拥有与您相同的字体文件,但在我的机器上,PostScript名称为“EdwardianScriptITC”

答案 1 :(得分:4)

如果您的字体名称包含' - '字符,用空格字符替换它。例如,Arial-Bold.ttf就像[UIFont fontWithName:" Arial Bold"尺寸:10];

答案 2 :(得分:1)

我遇到了同样的问题。您可以在storyboard的界面构建器中将字体设置为标签。然后从标签中获取调试模式中的字体:

let cfnt = txtUsernameField.font

然后单击小调试窗口上的i按钮,将在控制台窗口中输出字体的系列名称。你可以这样使用它:

txtUsernameField.font = UIFont(name: "MyriadPro-CondIt", size: 14) 

答案 3 :(得分:0)

要使用的字体名称似乎是字体簿中的“姓氏”。我尝试了PostScript名称,但它并不总是有效。据我所知,姓氏一直在努力。直到现在。

您可以检查此信息,如上面的答案中所述,在Font Book中,选择字体并按cmd + I.

希望这会有所帮助......

答案 4 :(得分:0)

我遇到了这个问题,虽然我发誓以前我的自定义字体工作得很好。

原来我只需要在XCode项目的项目上运行“Clean”,这样就可以重新建立引用。

答案 5 :(得分:0)

我遇到的问题是,字体家族中的某些字体正确返回,而其他字体返回了nil

例如:

  • MuseoSansRounded-500有效
  • MuseoSansRounded-900

事实证明,Xcode自动包含了Interface Builder中使用的自定义字体。我在IB中使用的是500重量字体,而不是900重量的字体。

这两个步骤已为我修复:

  1. 在“构建设置”中,找到并禁用Auto-Activate Custom Fonts。在我的项目中有两个实例。

  2. 在应用启动时,向系统手动注册自定义字体。我使用了这个答案的摘录:https://stackoverflow.com/a/32600784/131378

以完整性为名,我本可以打开Auto-Activate Custom Fonts,然后跳过在代码中注册这些字体的操作。但是,如果我最终在IB中使用了以前手动注册的新字体,就不想在开发过程中更新代码。如果您注册的字体已经自动激活,则Xcode会抱怨。