[UIFont familyName]
从iPhone OS 2.0开始就得到支持(在2.0之前,iPhone或iPod touch上不允许第三方应用程序),因此我建议使用它来检查当前设备上是否存在字体系列,如果不存在,则使用适合当前版本iOS的备用字体。以下是John Gruber在2007年发布的iPhone字体列表(与当时的Mac OS X中的字体进行对比)。我没有检查它们全部,但我检查了一些iOS字体,它们仍然存在于iOS 5中:
这里是一个使用[UIFont familyName]
的示例:
NSLog (@"Font families: %@", [UIFont familyNames]);
这将产生如下列表:
字体系列:( Thonburi, "Snell Roundhand", "Academy Engraved LET",...等等。
一旦您知道字体系列名称,您可以使用UIFont
类方法fontNamesForFamilyName
获取该系列中所有字体的名称NSArray。例如:
NSLog (@"Courier New family fonts: %@", [UIFont fontNamesForFamilyName:@"Courier New"]);
这将产生一个类似这样的列表:
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);
}
想要了解更多信息,请查看iOS开发者参考文档中UIFont
类方法familyNames和fontNamesForFamilyName:。
如果您使用Swift,可以打印所有字体(参见下文)。您还可以检查字体是否存在。
for family in UIFont.familyNames {
print("\(family)")
for name in UIFont.fontNames(forFamilyName: family) {
print(" \(name)")
}
}
忘记那些for循环吧,这是查看iOS支持的字体最简单的方法。
只需在Playground中运行以下任何一个。
输入
dump(UIFont.familyNames)
输出
▿ 75 elements
- "Copperplate"
- "Heiti SC"
- "Kohinoor Telugu"
...
输入
dump(UIFont.familyNames.compactMap { UIFont.fontNames(forFamilyName: $0) })
输出
▿ 248 elements
- "Copperplate-Light"
- "Copperplate"
- "Copperplate-Bold"
...
输入
dump(UIFont.fontNames(forFamilyName: "Helvetica Neue"))
输出
▿ 14 elements
- "HelveticaNeue-Italic"
- "HelveticaNeue-Bold"
- "HelveticaNeue-UltraLight"
- "HelveticaNeue-CondensedBlack"
...
这种字体在4.1版本中不可用,但在4.3版本中支持。如何最好地检查该字体是否存在?
通常通过UIFont* f = [UIFont fontWithName:... size:...];
的方式来请求该字体。如果该字体不可用,则结果(f
)将为nil。
(确保字体可用的一种方法是将其包含在应用程序bundle中...)
对于iOS9 / Swift 2.0,以上方法都不适用了,因为语法有所改变。我个人更喜欢使用扩展(我选择为UIFont创建一个扩展,因为它最适合,并修改了@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()
它会将所有字体以某种形式告诉你。
: 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)") }) })
以下是我在Objective-C中查找字体是否可用的方法:
NSFont *font = [NSFont fontWithName:@"thefont" size:25.0];
if (font==nil) {
// thefont is available
} else {
// thefont is not available
}
nil
则执行其他操作。Swift代码:
if let font = UIFont(name: name, size: size) { // 正常 } else { // 不正常 }
struct TitleViewModifier_Previews:
PreviewProvider {
static var previews: some View {
List{
ForEach(UIFont.familyNames.sorted(),id: \.self){ family in
ForEach(UIFont.fontNames(forFamilyName: family), id: \.self){ eachFont in
Text(eachFont)
.font(.custom(eachFont, size: 22))
}
}
}
}
}
for family:String in (UIFont.familyNames() as String[]) { println(family) for name:String in (UIFont.fontNamesForFamilyName(family) as String[]) { println("\t \(name)") } }
- magegu