自定义字体在 iOS 8 中不起作用

Posted

技术标签:

【中文标题】自定义字体在 iOS 8 中不起作用【英文标题】:Custom Font is not working in iOS 8 【发布时间】:2014-09-20 15:39:32 【问题描述】:

我的项目中包含一个自定义字体,在我将 Xcode 升级到版本 6 并使用 ios 8 作为基础 SDK 之前,它一直运行良好。现在,如果我在 iOS 8 模拟器或设备上运行应用程序,自定义字体不再有效,但它仍然适用于我的 iOS 7 设备。有什么建议吗?

【问题讨论】:

Info.plist 中的条目看起来如何。文件在您的应用程序中的什么位置?你是如何访问字体的? 我知道至少在 Xcode5 中,文件名中是否使用大写并不重要,但在设备上却很重要。也许他们也为 Xcode6 更改了这条规则。 @bdv 是的,我记得很久以前在处理模拟器和设备中显示/未显示的一些图像时。至于这个字体的东西,我查了一下,都是小写的,和磁盘上的文件名匹配。 如果它不是系统文件名,那么我会查看复制包资源,看看它们是否被列为字体。我必须以艰难的方式找到它.. @bdv 我刚刚发现 iOS 8 中发生了什么。请参阅下面的答案,不过感谢您的提示和提示。 【参考方案1】:

在我的情况下,另一个解决方案有效。当我将字体添加到项目中时,它们并没有自动添加到已编译的捆绑资源中。所以我不得不去 'Targets' -> 'Build Phases' -> 'Copy Bundle Resources' 并手动添加所有字体。这成功了

【讨论】:

【参考方案2】:

我找到了“丢失”字体的原因。实际上字体仍然存在,但是从 iOS 7 到 iOS 8 字体名称发生了微妙而突然的变化:在 iOS 7 中它被称为,例如“Custom_Font-Style”,但现在在 iOS 8 中称为“Custom-Font-Style”。注意 Custom 和 Font 之间的下划线现在变为破折号。幸运的是字体系列名称保持不变,与“自定义字体系列”相同,所以现在我必须从字体系列中提取字体名称,而不是硬编码字体名称,如下所示:

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;

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

【讨论】:

【参考方案3】:

如前所述,iOS 8 和之前版本的字体名称读取方式不同。我必须签到才能决定使用哪个名称:

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

您可以使用 Finder、Get Info 和 Font Book 来查找不同的名称(iOS 8 在 Font Book 中使用标题,而其余的在 Get Info 中使用 Full Name)

【讨论】:

【参考方案4】:

正如http://codewithchris.com/common-mistakes-with-adding-custom-fonts-to-your-ios-app/ 建议的那样,应该列出运行时可用的所有字体,以查看自定义字体是否可用:

for family: String in UIFont.familyNames() 
    print("\(family)")
    for name: String in UIFont.fontNamesForFamilyName(family) 
        print("== \(name)")
    

【讨论】:

【参考方案5】:

Lars Blumberg 回复 Swift 3

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

【讨论】:

以上是关于自定义字体在 iOS 8 中不起作用的主要内容,如果未能解决你的问题,请参考以下文章

自定义字体在 React Native 中不起作用

将自定义字体安装到 WP 中不起作用

系统字体在 iOS 模拟器中不起作用

向 iOS 项目添加自定义字体(影响)不起作用

React Native Expo 自定义字体权重在 iOS 设备上不起作用

自定义字体不起作用