OS X中使用自定义NSView的NSMenuItem没有高亮显示问题(Swift)

4

我正在构建一个仅有菜单栏的应用程序。我为我的菜单项创建了一个自定义视图,但在悬停时它没有高亮(蓝色)。

自定义类正在工作,它能检测到点击事件,但是没有高亮。我尝试在绘制方法中使用菜单的enclosingMenuItem属性来检查高亮状态,但没有效果。

override func draw(_ dirtyRect: NSRect) {
    super.draw(dirtyRect)
    if (self.enclosingMenuItem?.isHighlighted)! {
        // never triggered
    }
}

我使用xib来创建我的menuBar对象,并将一个类链接到它,其中包含以下代码来添加新项:

    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)

正常的菜单项可以正常工作,但当鼠标悬停在自定义视图上时,出现问题。请看下图:enter image description hereenter image description here。我已经无计可施了,需要任何帮助,谢谢。
1个回答

3
您需要实现自己的highlighted属性,并使用观察者来更新视图。
 var highlighted : Bool = false {
        didSet {
            if oldValue != highlighted {
                needsDisplay = true
            }
        }
    }

那么您需要覆盖 mouseEnteredmouseExited
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和跟踪区域以及viewWillMoveviewDidMoveToWindow来启用和禁用跟踪区域。

作为NSMenuItem替代品的自定义视图非常聪明,但您需要负责处理所有事件。


谢谢,我尝试过了,但是当我将鼠标悬停在菜单项上时,mouseEntered和mouseExited没有被调用 :( - Steven B.
然后您还需要实现NSTrackingArea。我原以为只需要处理操作,但显然还需要用它来突出显示视图。 - vadian

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接