【发布时间】:2011-12-16 03:55:52
【问题描述】:
我目前正在开发一个使用“ChalkboardSE-Regular”字体的应用程序,我的部署目标是 4.0+。此字体在 4.1 中不可用,但在 4.3 中受支持。检查字体是否存在的最佳方法是什么,如果不存在,请在
提前致谢!
T
【问题讨论】:
我目前正在开发一个使用“ChalkboardSE-Regular”字体的应用程序,我的部署目标是 4.0+。此字体在 4.1 中不可用,但在 4.3 中受支持。检查字体是否存在的最佳方法是什么,如果不存在,请在
提前致谢!
T
【问题讨论】:
[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"]);
这将产生一个像这样的列表:
Courier 新系列字体:( 快递新PSMT, "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)")
}
}
【讨论】:
此字体在 4.1 中不可用,但在 4.3 中受支持。检查字体是否存在的最佳方法是什么
使用UIFont* f = [UIFont fontWithName:... size:...]; 以通常的方式简单地询问字体。如果字体不可用,则结果 (f) 将为 nil。
(保证字体可用性的一种方法是将其包含在应用程序包中......)
【讨论】:
忘记那些 for 循环,这是查看 iOS 支持的字体的最简单方法。
只需在操场上运行以下任何一项即可。
输入
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"
...
【讨论】:
对于 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
希望对你有帮助!
【讨论】:
这是我在目标 c 上所做的,以确定字体是否可用
NSFont *font = [NSFont fontWithName:@"thefont" size:25.0];
if (font==nil) {
// thefont is available
} else {
// thefont is not available
}
【讨论】:
Swift 版本:
UIFont.familyNames().sort( { $0 < $1 } ).forEach({ print("\($0)"); UIFont.fontNamesForFamilyName("\($0)").sort( { $0 < $1 } ).forEach({ print(" \($0)") }) })
【讨论】:
好吧,您无需编写一行代码,只需打开 http://iosfonts.com 并根据您的 iOS 版本支持检查可用性。你也可以知道它的样子。
【讨论】:
这是 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,请执行其他操作。斯威夫特代码:
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);
}
}
【讨论】:
print("字体家族:%@", UIFont.familyNames)
【讨论】:
Swift 4.x
UIFont.familyNames().sort( { $0 < $1 } ).forEach({ print("\($0)"); UIFont.fontNamesForFamilyName("\($0)").sort( { $0 < $1 } ).forEach({ print(" \($0)") }) })
Swift 5.x
UIFont.familyNames.sorted( by: { $0 < $1 } ).forEach({ print("\($0)"); UIFont.fontNames(forFamilyName: "\($0)").sorted(by: { $0 < $1 } ).forEach({ print(" \($0)") }) })
【讨论】:
我认为使用 swiftui preview,您可以制作一个应用程序,使用预览模拟器显示每种字体的外观。
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))
}
}
}
}
}
这是我的预览图 按下播放按钮使列表具有交互性和可滚动性
【讨论】: