自定义字体在iOS 8中无法使用

8

我的项目中包含自定义字体,在我将Xcode升级到基于iOS 8的版本6之前,一切都能完美运行。现在,如果我在iOS 8模拟器或设备上运行应用程序,则自定义字体将不再起作用,但在我的iOS 7设备上仍然有效。有什么建议吗?


Info.plist中的条目是什么样子?该文件在您的应用程序中的位置在哪里?您如何访问字体? - idmean
我知道至少在Xcode5中,文件名是否使用大写字母并不重要,但在设备上却很重要。也许他们在Xcode6中改变了这个规则。 - bdv
@bdv 是的,我记得很久以前在处理一些在模拟器和设备中显示/不显示的图像时遇到过这个问题。至于这个字体问题,我已经检查过了,它们都是小写并且与磁盘上的文件名匹配。 - CodeBrew
如果不是系统文件名,那我会查看复制的捆绑资源,并查看是否在那里列出了字体。我曾经用一种艰难的方式找到了这个问题的答案... - bdv
@bdv,我刚刚发现iOS 8中发生了什么事情。请看下面的回答,不过还是谢谢你在这里的提示和提示。 - CodeBrew
我有相同的问题。 - leedream
5个回答

20

在我的情况下,另一种解决方案有效。当我将字体添加到项目中时,它们没有自动添加到编译后的捆绑资源中。因此,我必须手动添加所有字体,方法是:'Targets' -> 'Build Phases' -> 'Copy Bundle Resources'。这样就可以解决问题了。


1
我找到了"缺失"字体的原因。事实上,字体仍然存在,但是从iOS 7到iOS 8,字体名称发生了微妙但突然的变化:在iOS 7中,它被称为"Custom_Font-Style",但现在在iOS 8中被称为"Custom-Font-Style"。注意现在Custom和Font之间的下划线变成了破折号。幸运的是,字体系列名称仍然相同,为"Custom Font Family",所以现在我不必硬编码字体名称,而是必须从字体系列中提取它,如下所示:
static NSString *_myCustomFontName;

+ (NSString *)myCustomFontName
{
    if ( !_myCustomFontName )
    {
        NSArray *arr = [UIFont fontNamesForFamilyName:@"Custom Font Family"];
        // I know I only have one font in this family
        if ( [arr count] > 0 )
            _myCustomFontName = arr[0];        
    }

   return _myCustomFontName;
}

我不确定字体文件如何呈现其信息,但现在我猜测我的字体文件(custom font.ttf)只提供了一个字体系列名称“Custom Font Family”,iOS从某些规则中派生出其字体名称,由于某种原因,这个规则从iOS 7到iOS 8发生了变化,所以之前我们有Custom_Font-Style,现在我们有Custom-Font-Style。

0

Lars Blumberg 在 Swift 3 中的回答

    for family in UIFont.familyNames {
        print("\(family)")
        for name: String in UIFont.fontNames(forFamilyName: family) {
            print("== \(name)")
        }
    }

0

0

如之前所述,iOS 8及之前版本读取字体名称的方式是不同的。我已经加入了一个检查来决定使用哪个名称:

if ([[[UIDevice currentDevice] systemVersion] floatValue] >= 8) {
    OS_SPECIFIC_GOTHIC_FONT = @"New";
} else {
    OS_SPECIFIC_GOTHIC_FONT = @"Highway Gothic";
}

您可以使用Finder、获取信息和字体册来查找不同的名称(iOS 8在字体册中使用标题,而其他版本则在获取信息中使用全名)


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