【问题标题】:Get each char (with shape) of font from UIFont or .ttf file从 UIFont 或 .ttf 文件中获取字体的每个字符(带形状)
【发布时间】:2016-04-08 02:43:39
【问题描述】:

我不知道这可能与否,而且我确实尝试为我的问题找到解决方案但没有成功,这就是我在这里询问并希望我能得到解决方案的原因。

我正在开发一个与绘图相关的应用程序,我想在其中获取.ttf 文件或UIFont 提供的每种字体的形状。

例如

如果我有 UIFont/.ttf 文件,例如 "OpenSans-Italic",那么如何获得每个“字符”的形状 (这里是“斜体”形状)"OpenSans" 字体? 我想在Char or NSString.

=> @[ @"a", @"b", @"c", @"d",..@"A", @"B", @"C", @"D ",.....@"1", @"2", @"3"....]; // 这是一个字符数组,仅用于理解目的。

请给我建议,我怎样才能得到这个?

【问题讨论】:

  • 您希望每个字符作为attributed string 还是作为图像?
  • @KennethBruno 不是图像我希望每个字符都是字符串。
  • 也许这有帮助:stackoverflow.com/a/6991793/2754158 看起来那里的代码获得了字体字符集。
  • 你应该选择CTFont,而不是UIFontCGFont。 Core Text 是唯一可以让您获取字形的形状(路径)的框架(请注意,字体不代表字符,它代表字形。一个字符可以由多个字形组成,例如带有变音符号的字符和字符序列可以用一个字形表示,例如连字)。

标签: ios objective-c cocoa-touch fonts


【解决方案1】:

如果代码中列出了可用的字形,它是否有效?如果它有效,一切似乎都很容易。

我的意思是添加一些构建阶段来解析字体文件并生成一些代码,包括所有可用的字符。我创建了一个提供类似想法的项目IconFont。该项目从字体文件中提供 UIImage。在开发分支中,我添加了一个构建阶段以使用项目PyTTF 解析 ttf 字体文件并将代码添加到TBCityIcon.m。很容易修改 python 脚本来生成包含所有可用字符的 NSArray 代码。

【讨论】:

    【解决方案2】:

    这是一种方法,借用 this 帖子。它遍历NSCharacterSet 中所有可能的字符并找到有效的字符。现在它正在使用.URLPathAllowedCharacterSet(),但它可以使用其他人。

    import UIKit
    
    var attributedString = NSMutableAttributedString()
    if let font = UIFont(name: "OpenSans-Italic", size: 12) {
      let charset = NSCharacterSet.URLPathAllowedCharacterSet()
      for var plane : UInt32 in 0...16 where charset.hasMemberInPlane(UInt8(plane)) {
        let planeRange = (plane << 16)..<((plane+1) << 16)
        for characterValue in planeRange where charset.longCharacterIsMember(characterValue) {
          let character = String(UnicodeScalar(CFSwapInt32HostToLittle(characterValue)))
          attributedString.appendAttributedString(NSAttributedString(string:character, attributes: [NSFontAttributeName:font]))
        }
      }
    }
    

    【讨论】:

    • 谢谢你的回答,你能把这段代码转换成Objective-C吗?
    • @iPatel 您的问题将 Swift 列为您使用的语言。如果您转到我发布的链接,其中一个答案中有类似的 Objective-C 代码。
    猜你喜欢
    • 2014-06-04
    • 2011-01-01
    • 2013-05-23
    • 2012-08-06
    • 2023-03-27
    • 1970-01-01
    • 2016-02-02
    • 2013-08-22
    • 1970-01-01
    相关资源
    最近更新 更多