如何生成一组过滤的可用字体系列名称? (如在 Pages 或 TextEdit 中)
Posted
技术标签:
【中文标题】如何生成一组过滤的可用字体系列名称? (如在 Pages 或 TextEdit 中)【英文标题】:How do I generate a filtered set of available font family names? (like in Pages or TextEdit) 【发布时间】:2014-01-25 03:41:28 【问题描述】:我想制作一个类似于 Pages.app(或 TextEdit.app)中的弹出按钮,其菜单是字体系列的过滤列表。
我可以从[NSFontManager availableFontFamilies]
获得一系列可用的字体系列名称,但这提供的字体系列比 Pages 的弹出菜单中的要多得多。
另一方面,我可以从[NSFontCollection fontCollectionWithName:NSFontCollectionUser]
中获得似乎是正确过滤的字体描述符集,但这也包括该系列的每个成员(斜体、粗体等)。我不想在弹出窗口中包含每个成员,只包含姓氏。
我想要过滤组family姓名。
我从NSFontManager
中获得的名称似乎已针对 UI 进行了清理,而我从字体描述符的属性字典 ([myFontDescriptor fontAttributes][NSFontNameAttribute]
) 中获得的名称值则没有。所以我不能只根据字符串值对两组进行简单的集合交集,相同的东西可能有不同的名称。
【问题讨论】:
你看过NSFontFamilyAttribute
和NSFontVisibleNameAttribute
吗?
@KenThomases 是的。我遍历了从 fontCollection 返回的 fontDescriptors 数组,记录了每个属性的字典,但每次唯一的键是 NSFontNameAttribute
(具有“HelveticaNeue-CondensedBlack”等值)和 NSCTFontDesignLanguagesAttribute
(在我的情况下) , 值总是 "en")。
NSFontDescriptor
在我的测试中有点奇怪。如果你直接记录它或者你请求它的-fontAttributes
,你可能会得到很少的属性。但是,如果你调用它的-objectForKey:
方法,你可以获得更多。
@KenThomases 谢谢。它在那里。你想写一个快速的答案吗?
【参考方案1】:
您可以使用-[NSFontDescriptor objectForKey:]
检索-fontAttributes
字典中不存在的属性。如果您使用属性键 NSFontFamilyAttribute
,则会为您提供字体系列名称。将其应用于[NSFontCollection fontCollectionWithName:NSFontCollectionUser]
中的每个字体描述符应该可以满足您的需求。
【讨论】:
我已经阅读并重读了课程标题、文档、文章、博客文章等,但没有一个来源(我已经注意到)提到你在这里雄辩地陈述的内容.你刚刚挽救了我的理智。为什么文档中没有一个地方指出“使用objectForKey:
方法检索fontAttributes
字典中找不到的属性?!”我的意思是,我在本地拥有的文档似乎确实缺少一些东西(自从 Swift 出现以来),但你会认为他们现在已经修复了大部分......哦,好吧。我只是想说声谢谢。 非常感谢您的回答。【参考方案2】:
let collection = NSFontCollection(name: "Fixed Width")
var names = [String]()
for description in (collection?.matchingDescriptors)!
let name = description.fontAttributes[NSFontNameAttribute] as! String
names.append(name)
print(names)
这是我的代码,可以节省一些时间
迅捷
let collection = NSFontCollection(name: NSFontCollection.Name(rawValue: "Fixed Width"))
let names = collection?.matchingDescriptors?.compactMap $0.fontAttributes[.name] as? String
假设 names
不是 nil,您可以通过 Set(names)
创建一个集合来区分它们(如您所愿)。
【讨论】:
我为这个答案添加了一个 Swiftlier 方法。 :-)以上是关于如何生成一组过滤的可用字体系列名称? (如在 Pages 或 TextEdit 中)的主要内容,如果未能解决你的问题,请参考以下文章
FFmpegffmpeg 命令查询二 ( 比特流过滤器 | 可用协议 | 过滤器 | 像素格式 | 标准声道布局 | 音频采样格式 | 颜色名称 )