我正在开发Swift 3中的iOS应用程序。 在这个应用程序中,我列出了所有可用的字体(系统提供),但我也想列出所有可用的字符。
例如我使用Font Awesome,我希望用户能够从列表中选择任何字符/符号。我怎么能这样做?
这是我获取字体数组的方法。如何获取所选字体的所有字符数组?
UIFont.familyNames.map({ UIFont.fontNames(forFamilyName: $0)}).reduce([]) { $0 + $1 }
答案 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”并显示它们。