带有 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
希望对您有所帮助,如果您仍然遇到问题...
我打算用系统中可用的字体列表创建一个 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
希望对您有所帮助,如果您仍然遇到问题...