【问题标题】:How to check if a font is available in version of iOS?如何检查字体是否在 iOS 版本中可用?
【发布时间】:2011-12-16 03:55:52
【问题描述】:

我目前正在开发一个使用“ChalkboardSE-Regular”字体的应用程序,我的部署目标是 4.0+。此字体在 4.1 中不可用,但在 4.3 中受支持。检查字体是否存在的最佳方法是什么,如果不存在,请在

提前致谢!

T

【问题讨论】:

    标签: iphone ios ios4


    【解决方案1】:

    [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 类方法 familyNamesfontNamesForFamilyName:

    【讨论】:

    • 我还编写了一个应用程序,用示例文本将它们全部转储。可能只想从这个github.com/palmerc/iOS5Fonts开始
    • 这在 swift 中是一样的:for family:String in (UIFont.familyNames() as String[]) { println(family) for name:String in (UIFont.fontNamesForFamilyName(family) as String[]) { println("\t (name)") } }
    【解决方案2】:

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

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

    【讨论】:

      【解决方案3】:

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

      使用UIFont* f = [UIFont fontWithName:... size:...]; 以通常的方式简单地询问字体。如果字体不可用,则结果 (f) 将为 nil。

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

      【讨论】:

      • 您能详细说明一下吗? (“将它包含在应用程序包中”)你会怎么做,你可以从哪里复制它,它不会违反(十几个)法律/版权/等吗?我在问,因为在 iOS6 中 MarkerFelt 字体有一个“错误”。希腊字母 s(最终 sigma)显示为小写 Zeta... 我可以在我的应用程序中包含 iOS5 MarkerFelt 吗?我该怎么做呢?
      • 字体就像项目中的任何其他资源一样。如果它包含在 Copy Bundle Resources 构建阶段,它会,呃,复制到你的 bundle 中。见我的书:apeth.com/iOSBook/ch06.html#_the_target。请注意,您需要在 Info.plist 中设置 UIAppFonts 键,以提醒运行时您的包中有需要获取的字体。
      【解决方案4】:

      斯威夫特 5.x

      忘记那些 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"
        ...
      

      【讨论】:

      • 非常有帮助!!谢谢!
      • 我怎么不知道转储?不错
      • 对于上面的仅字体名称示例,compactMap 方法生成按字体名称分组的二维字符串数组。如果您需要将所有字体名称放在一个字符串数组中,请使用 flatMap 而不是 compactMap。
      【解决方案5】:

      对于 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
      

      希望对你有帮助!

      【讨论】:

        【解决方案6】:

        这是我在目标 c 上所做的,以确定字体是否可用

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

        【讨论】:

        • 我很确定如果字体为 nil,字体不可用 =p
        【解决方案7】:

        Swift 版本:

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

        【讨论】:

          【解决方案8】:

          好吧,您无需编写一行代码,只需打开 http://iosfonts.com 并根据您的 iOS 版本支持检查可用性。你也可以知道它的样子。

          【讨论】:

            【解决方案9】:

            这是 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)
                }
            

            【讨论】:

              【解决方案10】:

              尝试使用该字体名称进行初始化,如果是nil,请执行其他操作。斯威夫特代码:

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

              【讨论】:

                【解决方案11】:

                对于objective-c

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

                【讨论】:

                  【解决方案12】:

                  print("字体家族:%@", UIFont.familyNames)

                  【讨论】:

                    【解决方案13】:

                    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)") }) })
                    

                    【讨论】:

                      【解决方案14】:

                      我认为使用 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))
                                      }
                                  }
                              }
                          }
                      }
                      

                      这是我的预览图 按下播放按钮使列表具有交互性和可滚动性

                      【讨论】:

                        猜你喜欢
                        • 1970-01-01
                        • 2011-12-22
                        • 1970-01-01
                        • 2012-09-01
                        • 2012-09-15
                        • 1970-01-01
                        • 2023-03-23
                        • 1970-01-01
                        • 2018-01-18
                        相关资源
                        最近更新 更多