带有自定义NSView的OSX NSMenuItem不会突出显示swift

问题描述 投票:2回答:1

我正在建立一个仅限菜单栏的应用程序。我的menuItem有一个自定义视图,但是当悬停时它不是高亮显示(蓝色)。

自定义类正在工作,它正在检测点击但它没有突出显示,我尝试使用菜单中的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)

normal menuItems按预期工作 - 但是当鼠标悬停在自定义视图上时

enter image description hereenter image description here

我没有想法,任何帮助表示赞赏,谢谢。

swift xcode macos swift3 swift4
1个回答
2
投票

您需要使用观察者实现自己的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的替代品的自定义视图非常智能,但您有责任处理所有事件。

© www.soinside.com 2019 - 2024. All rights reserved.