从UIFont或.ttf文件中获取字体的每个字符(带形状)

9

我不确定是否可能实现,也尝试寻找解决方案,但没有成功,所以我在这里提问,希望能得到解决方案。

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

例如:

如果我有一个UIFont/.ttf文件,比如"OpenSans-Italic",那么如何获得每个字符的形状(这里是"Italic"形状)"OpenSans"字体?并且我想用Char或NSString来实现。

=> @[@"a", @"b", @"c", @"d",..@"A", @"B", @"C", @"D",.....@"1", @"2", @"3"....]; // 这只是为了理解的字符数组。

请建议我如何获得这个?


你想把每个字符作为属性字符串还是作为图像呢? - user887210
@KennethBruno 我不是想要图像,我想要每个字符作为字符串。 - iPatel
也许这可以帮助:http://stackoverflow.com/a/6991793/2754158 看起来那里的代码获取了字体字符集。 - Krzysztof
1
你应该使用CTFont而不是UIFont或者CGFont。Core Text是唯一一个可以让你获取字形(路径)的框架(请注意,字体并不代表字符,它代表字形。一个字符可以由多个字形组成,例如带有变音符号的字符,而字符序列可以用一个字形表示,例如连字)。 - Sulthan
2个回答

3
这是一种方法,借鉴了这篇文章。它遍历了一个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
1
@iPatel,你的问题中列出了你正在使用的语言是Swift。如果你访问我发布的链接,其中一个答案中有类似的Objective-C代码。 - user887210

0

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

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


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接