1

我想制作一个类似于 Pages.app(或 TextEdit.app)中的弹出按钮,其菜单是字体系列的过滤列表。

我可以从 中获得一系列可用的字体系列名称[NSFontManager availableFontFamilies],但这提供的字体系列比 Pages 的弹出菜单中的要多得多。

另一方面,我可以从 中获得似乎正确过滤的字体描述符集[NSFontCollection fontCollectionWithName:NSFontCollectionUser],但这也包括该系列的每个成员(斜体、粗体等)。我不想在弹出窗口中包含每个成员,只包含姓氏。

我想要过滤后的一组姓氏

我从 UI 中获得的名称NSFontManager似乎已针对 UI 进行了清理,而我从字体描述符的属性字典 ( [myFontDescriptor fontAttributes][NSFontNameAttribute]) 中获得的名称值却没有。所以我不能只根据字符串值对两组进行简单的集合交集,相同的东西可能有不同的名称。

4

2 回答 2

3

您可以使用检索字典-[NSFontDescriptor objectForKey:]中不存在的属性。-fontAttributes如果您使用属性 key NSFontFamilyAttribute,则会为您提供字体系列名称。将其应用于每个字体描述符[NSFontCollection fontCollectionWithName:NSFontCollectionUser]应该可以满足您的需求。

于 2014-01-26T07:40:51.843 回答
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)

于 2017-09-26T18:49:20.240 回答