如何生成一组过滤的可用字体系列名称? (如在 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]) 中获得的名称值则没有。所以我不能只根据字符串值对两组进行简单的集合交集,相同的东西可能有不同的名称。

【问题讨论】:

你看过NSFontFamilyAttributeNSFontVisibleNameAttribute吗? @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 中)的主要内容,如果未能解决你的问题,请参考以下文章

如何自动缩放一组控件的字体大小?

获取字体系列的可用字体样式

如何确定 pdf 文档中单词的字体系列和字体大小?

FFmpegffmpeg 命令查询二 ( 比特流过滤器 | 可用协议 | 过滤器 | 像素格式 | 标准声道布局 | 音频采样格式 | 颜色名称 )

根据可用的文本字体大小和字体名称初始化 UITextView

浏览器使用不同的字体系列名称?