swift - 具有自定义 NSView 的 OS X NSMenuItem 不会突出显示 swift

标签 swift xcode macos swift3 swift4

我正在构建一个只有菜单栏的应用程序。我的 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 上时

enter image description here . enter image description here

我没有想法,感谢任何帮助,谢谢。

最佳答案

你需要实现你自己的 highlighted 属性,用观察者来更新 View

 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 来启用和禁用跟踪区域。

用自定义 View 代替 NSMenuItem 非常聪明,但您有责任处理所有事件。

关于swift - 具有自定义 NSView 的 OS X NSMenuItem 不会突出显示 swift,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43265671/

相关文章:

xcode - 在 SwiftUI macOS 应用程序的主菜单中启用菜单项?

macos - 如何在 OS X Yosemite 中开发状态栏应用程序?

php - 带地理定位的 Swift 自动推送通知

swift - 如何将闭包类型的 let 属性初始化为指向某个方法的指针?

ios - Storyboard问题 : Gesture recognisers cannot be used on prototype objects

objective-c - 如何从导航栏中删除后退按钮

c - 在 OSX 上使用 GDB 检测堆栈损坏(在金丝雀值上设置观察点)

swift - parse.com 查询后从类中快速返回值

ios - 如何在每次新单元格出现时访问 UITableView.visibleCells

ios - Xcode中的框架图标颜色