OS X NSMenuItem with custom NSView does not highlight swift
OS X NSMenuItem with custom NSView does not highlight swift
我正在构建一个只有菜单栏的应用程序。我的 menuItem 有一个自定义视图,但悬停时它不是突出显示(蓝色)。
自定义 class 正在工作,它正在检测点击但没有突出显示,我尝试使用菜单中的 enclosingMenuItem 属性 来检查 draw 方法中的突出显示状态,但这没有用
override func draw(_ dirtyRect: NSRect) {
super.draw(dirtyRect)
if (self.enclosingMenuItem?.isHighlighted)! {
// never triggered
}
}
我将 xib 用于我的 menuBar 对象,并在添加新项目时将 class 链接到包含此代码的它:
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)
正常的菜单项按预期工作 - 但当鼠标悬停在自定义视图上时
.
我没有想法,感谢任何帮助,谢谢。
您需要实现自己的 highlighted
属性 并使用观察者来更新视图
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
以启用和禁用跟踪区域。
替代 NSMenuItem
的自定义视图非常聪明,但您有责任处理所有事件。
我正在构建一个只有菜单栏的应用程序。我的 menuItem 有一个自定义视图,但悬停时它不是突出显示(蓝色)。
自定义 class 正在工作,它正在检测点击但没有突出显示,我尝试使用菜单中的 enclosingMenuItem 属性 来检查 draw 方法中的突出显示状态,但这没有用
override func draw(_ dirtyRect: NSRect) {
super.draw(dirtyRect)
if (self.enclosingMenuItem?.isHighlighted)! {
// never triggered
}
}
我将 xib 用于我的 menuBar 对象,并在添加新项目时将 class 链接到包含此代码的它:
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)
正常的菜单项按预期工作 - 但当鼠标悬停在自定义视图上时
我没有想法,感谢任何帮助,谢谢。
您需要实现自己的 highlighted
属性 并使用观察者来更新视图
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
以启用和禁用跟踪区域。
替代 NSMenuItem
的自定义视图非常聪明,但您有责任处理所有事件。