从字体中获取所有可用字符

时间:2017-01-11 13:24:08

标签: swift fonts

我正在开发Swift 3中的iOS应用程序。 在这个应用程序中,我列出了所有可用的字体(系统提供),但我也想列出所有可用的字符。

例如我使用Font Awesome,我希望用户能够从列表中选择任何字符/符号。我怎么能这样做?

这是我获取字体数组的方法。如何获取所选字体的所有字符数组?

UIFont.familyNames.map({ UIFont.fontNames(forFamilyName: $0)}).reduce([]) { $0 + $1 }

2 个答案:

答案 0 :(得分:4)

对于每个UIFont,您必须获取该字体的characterSet。例如,我首先采取UIFont。

let firsttFont = UIFont.familyNames.first

let first = UIFont(name: firsttFont!, size: 14)
let fontDescriptor = first!.fontDescriptor
let characterSet : NSCharacterSet = fontDescriptor.object(forKey: UIFontDescriptorCharacterSetAttribute) as! NSCharacterSet

然后,使用此扩展来获取该NSCharacterSet的所有字符:

extension NSCharacterSet {
    var characters:[String] {
        var chars = [String]()
        for plane:UInt8 in 0...16 {
            if self.hasMemberInPlane(plane) {
                let p0 = UInt32(plane) << 16
                let p1 = (UInt32(plane) + 1) << 16
                for c:UTF32Char in p0..<p1 {
                    if self.longCharacterIsMember(c) {
                        var c1 = c.littleEndian
                        let s = NSString(bytes: &c1, length: 4, encoding: String.Encoding.utf32LittleEndian.rawValue)!
                        chars.append(String(s))
                    }
                }
            }
        }
        return chars
    }
}

(参考:NSArray from NSCharacterset

所以,最后,只需调用characterSet.characters来获取所有字符(在String中)

答案 1 :(得分:0)

我认为如果没有大量编码,你将无法做到。以下是Apple文档的一些链接:

在他们的main font page中,您需要向下滚动一下才能找到文档列表,但在该列表中是TrueType reference manual。字符存储为字形,这意味着它们是基于矢量的,以允许清晰的字体大小。 (我相信IB中字体大小的简单下拉仅仅是“建议”,您可以输入您关心的任何尺寸。)

在第二个链接中,向下滚动到冗长的字体表列表。一看起来很有希望 - cmap table。但仔细阅读,可以(a)有“umlaut A”或中文等外来字符,(b)省略每种字体中的字符。此外,这只是一个查找表 - 您可能需要使用映射表来获取字形的位置。

如果您只定位英语,最好找一种方法来检查字体是否存在字母“Aa”并显示它们。