我正在构建一个只有菜单栏的应用程序。我的 menuItem 有一个自定义 View ,但悬停时它不是突出显示(蓝色)。
自定义类正在工作,它正在检测点击但没有突出显示,我尝试使用菜单中的 enclosingMenuItem 属性来检查 draw 方法中的突出显示状态,但这没有用
override func draw(_ dirtyRect: NSRect) {
super.draw(dirtyRect)
if (self.enclosingMenuItem?.isHighlighted)! {
// never triggered
}
}
我为我的 menuBar 对象使用了一个 xib,并在添加新项目时将一个包含此代码的类链接到它:
menuItem = NSMenuItem()
menuItem.target = self
menuItem.isEnabled = true
view = MenuBarItem(frame: NSRect(x: 0, y: 0, width: 230, height: 28))
view.delegate = self
view.setupWith(title: "", lastRun: "", running: false)
menuItem.view = view.view
statusMenu.insertItem(menuItem, at: 1)
正常的 menuItems 按预期工作 - 但当鼠标悬停在自定义 View 上时
我没有想法,感谢任何帮助,谢谢。
最佳答案
你需要实现你自己的 highlighted
属性,用观察者来更新 View
var highlighted : Bool = false {
didSet {
if oldValue != highlighted {
needsDisplay = true
}
}
}
然后你必须覆盖mouseEntered
和mouseExited
override func mouseEntered(with theEvent: NSEvent) { highlighted = true }
override func mouseExited(with theEvent: NSEvent) { highlighted = false }
和drawRect
像这样:
override func draw(_ dirtyRect: NSRect) {
super.draw(dirtyRect)
if highlighted && enclosingMenuItem!.isHighlighted {
NSColor.selectedMenuItemColor.set()
} else {
NSColor.clear.set()
}
NSBezierPath.fill(dirtyRect)
}
您还可以分别调整标签文本颜色。
如果您想触发菜单项操作,您还需要实现 mouseUp
和跟踪区域以及 viewWillMove
和 viewDidMoveToWindow
来启用和禁用跟踪区域。
用自定义 View 代替 NSMenuItem
非常聪明,但您有责任处理所有事件。
关于swift - 具有自定义 NSView 的 OS X NSMenuItem 不会突出显示 swift,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43265671/