自定义字体不适用于iOS 8

我有一个自定义的字体包含在我的项目,这工作完全正常,直到我升级我的Xcode版本6与iOS 8作为基础的SDK。 现在,如果我在iOS 8模拟器或设备上运行应用程序,自定义字体将不再有效,但它仍然可以在我的iOS 7设备上运行。 有什么build议么?

在我的情况下,另一个解决scheme工作 当我将字体添加到项目中时,它们不会自动添加到已编译的束包资源中。 所以我不得不去“目标” – >“build立阶段” – >“复制捆绑资源”,并手动添加所有的字体。 这个伎俩

我find了“缺less”字体的原因。 事实上,字体仍然存在,但从iOS 7到iOS 8,字体名称有一个微妙但突然的变化:在iOS 7中调用,例如“Custom_Font-Style”,但现在在iOS 8中称为“Custom-字体样式”。 注意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。

如前所述,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使用字体书中的标题,其余的使用Get Info中的Full Name)

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

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

Lars Blumberg在Swift 3回答

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