swift - 带有包含 NSFont 对象的 attributedTitle 的 NSMenuItem 绘制带有基线偏移的标题

标签 swift macos nsattributedstring appkit nsmenuitem

我打算用系统中可用的字体列表创建一个 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。这带来了更多的困惑。似乎有些字体没有在边界内绘制。

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

That's how it looks

最佳答案

可能是 NSAttributedString 的问题。

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

enter image description here

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

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

关于swift - 带有包含 NSFont 对象的 attributedTitle 的 NSMenuItem 绘制带有基线偏移的标题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/65166783/

相关文章:

html - 在 NSAttributedString 中转换 html 数据的时间太长。有任何想法吗?

ios - iOS:如何更改字符串中某些字符的颜色/字体

ios - WKWebView 中的 EXC_BAD_ACCESS 和/或 EXC_BREAKPOINT - 可能的更改以快速修复

ios - 如何在 UIAlertAction 中显示选定的操作?

macos - Hammerspoon - 如何粘贴文本?

ios - 使用 Swift 将顶部和底部填充添加到 UILabel

ios - 即使添加了 View ,UIViewContorller 的触摸事件仍然会收到

swift - ARKit:如何在 Storyboard 中向 ARView 添加按钮?

java - 尝试安装 JDK8 U11 OSX 10.10 Yosemite 时出错

objective-c - 添加图像边框