带有 attributedTitle 的 NSMenuItem 包含 NSFont object 绘制带有基线偏移的标题

NSMenuItem with attributedTitle containing an NSFont object draws the title with baseline shift

我打算用系统中可用的字体列表创建一个 NSPopUpButton。看起来很明显的任务,但我失败了。我想,我遗漏了一些非常明显的东西,以至于我完全忘记了它。

代码非常简单:

let button = NSPopUpButton()
button.menu = NSMenu()

NSFontManager.shared.availableFonts.forEach { fontNameString in
            let item = NSMenuItem()
            let font = NSFont(name: fontNameString, size: 14)!

            let attrs: [NSAttributedString.Key: Any] = [.font: font]
            item.attributedTitle = NSAttributedString(string: fontNameString, attributes: attrs)

            button.menu?.addItem(item)
}

但这只是创建了 NSMenu,其中的项目基线发生了偏移。我试图计算基线偏移并将其添加为属性,但我失败了。还没有找到一个算法来满足系统中所有可用的字体。

此外,添加基线偏移会调整相应的 NSMenuItem 的大小,它没有固定大小,顺便说一下 - 项目的高度在每种字体上都不同。

为了分析情况,我添加了 .backgroundColor 属性并将其设置为红色 NSColor。这带来了更多的混乱。似乎有些字体没有在边界内绘制。

如何使属性标题垂直居中?请帮忙!

可能是NSAttributedString的问题。

为了解决这个问题,我创建了一个自定义视图并使用技巧在其中绘制了一个字符串。 然后设置为NSMenuItem.view.

获取更多详细信息,请参阅下面的代码。 https://github.com/bluedome/FontSelectionView/blob/main/FontSelectionView.swift

希望对您有所帮助,如果您仍然遇到问题...