如何检查在iOS版本中是否有字体?

我目前正在使用“ChalkboardSE-Regular”字体的应用程序,我的部署目标是4.0+。 该字体在4.1中不可用,但在4.3中支持。 最好的方法是检查字体是否存在,如果不存在,请在<4.1版本的iOS上使用其他支持的字体。 [UIFont familyName]返回这些字体的列表“Chalkboard SE”

提前致谢!

Ť

[UIFont familyName]支持返回到iPhone OS 2.0(在2.0之前,iPhone或iPod touch上不允许使用第三方应用程序),所以我将使用它来检查当前设备上是否存在字体系列,如果它不存在,为该版本的iOS使用合适的回退字体。 这里是John Gruber在2007年的原始iPhone中的iPhone字体列表(与当天的Mac OS X中的字体形成对比)。 我没有检查他们全部,但我检查的iOS字体仍然在iOS 5中:

以下是使用[UIFont familyName]的示例:

 NSLog (@"Font families: %@", [UIFont familyNames]); 

这将产生一个像这样的列表:

字体家庭:(吞武里,“斯内尔圆手”,“学院雕刻LET”,等等。

一旦知道了姓氏,就可以使用UIFont类的方法fontNamesForFamilyName来获取家族中所有字体名称的NSArray。 例如:

 NSLog (@"Courier New family fonts: %@", [UIFont fontNamesForFamilyName:@"Courier New"]); 

这将产生一个像这样的列表:

快递新家庭字体:(CourierNewPSMT,“CourierNewPS-BoldMT”,“CourierNewPS-BoldItalicMT”,“CourierNewPS-ItalicMT”)

以下示例代码打印当前设备上每个族中的每种字体的列表:

 NSArray *fontFamilies = [UIFont familyNames]; for (int i = 0; i < [fontFamilies count]; i++) { NSString *fontFamily = [fontFamilies objectAtIndex:i]; NSArray *fontNames = [UIFont fontNamesForFamilyName:[fontFamilies objectAtIndex:i]]; NSLog (@"%@: %@", fontFamily, fontNames); } 

有关更多信息,请查看UIFont类方法familyNames和fontNamesForFamilyName的iOS开发人员参考文档: 。

如果你使用Swift,你可以打印所有的字体(见下文)。 您也可以检查字体是否存在。

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

该字体在4.1中不可用,但在4.3中支持。 什么是检查字体是否存在的最好方法

只需使用UIFont* f = [UIFont fontWithName:... size:...];按常规方式询问字体UIFont* f = [UIFont fontWithName:... size:...]; 。 如果字体不可用,结果( f )将为零。

(保证字体可用性的一种方法是将其包含在应用程序包中)

Swift 3.x

忘记那些for循环,这是看到iOS支持的字体的最简单的方法。

只要在操场上运行以下任何一项。


家庭名字

input

 dump(UIFont.familyNames) 

产量

 ▿ 75 elements - "Copperplate" - "Heiti SC" - "Kohinoor Telugu" ... 

仅限字体名称

input

 dump(UIFont.familyNames.flatMap { UIFont.fontNames(forFamilyName: $0) }) 

产量

 ▿ 248 elements - "Copperplate-Light" - "Copperplate" - "Copperplate-Bold" ... 

指定的家庭名称的字体名称

input

 dump(UIFont.fontNames(forFamilyName: "Helvetica Neue")) 

产量

 ▿ 14 elements - "HelveticaNeue-Italic" - "HelveticaNeue-Bold" - "HelveticaNeue-UltraLight" - "HelveticaNeue-CondensedBlack" ... 

这是我在目标c上做的,以查明字体是否可用

 NSFont *font = [NSFont fontWithName:@"thefont" size:25.0]; if (font==nil) { // thefont is available } else { // thefont is not available } 

对于iOS9 / Swift 2.0,以上都不会工作,因为语法稍有改变。 我个人也喜欢使用扩展(我select为UIFont创build一个,因为它适合最好的和修改的@API答案,因为这是最好的):

 extension UIFont { static func availableFonts() { // Get all fonts families for family in UIFont.familyNames() { NSLog("\(family)") // Show all fonts for any given family for name in UIFont.fontNamesForFamilyName(family) { NSLog(" \(name)") } } } } 

现在你可以打电话给:

 UIFont.availableFonts() 

它会告诉你所有的字体的forms

 : Bangla Sangam MN : BanglaSangamMN-Bold : BanglaSangamMN : Zapfino : Zapfino 

希望能帮助到你!

Swift版本:

 UIFont.familyNames().sort( { $0 < $1 } ).forEach({ print("\($0)"); UIFont.fontNamesForFamilyName("\($0)").sort( { $0 < $1 } ).forEach({ print(" \($0)") }) }) 

这是Steves对Swift代码的转换(用于快速复制和粘贴目的):

  var fontFamilies = UIFont.familyNames() for (var i:Int = 0; i < fontFamilies.count; i++) { var fontFamily: NSString = fontFamilies[i] as NSString var fontNames: NSArray = UIFont.fontNamesForFamilyName(fontFamilies[i] as String) as NSArray NSLog ("%@: %@", fontFamily, fontNames) } 

尝试初始化该字体的名称,如果nil做其他的事情。 SWIFT代码:

if let font = UIFont(name: name, size: size) { // ok } else { // not ok }

对于objective-c

 for (NSString *family in UIFont.familyNames) { NSLog(@"family %@",family); for (NSString *name in [UIFont fontNamesForFamilyName:family]) { NSLog(@" name = %@",name); } }