3

试图识别右键单击 aNSStatusItem我得到了一个建议(感谢Zoff Dino 使用 a 。但由于某些奇怪的原因,它没有按应有的方式工作。我能够识别左键单击 ( ) 但不能识别右键单击 ( )。这就是我希望它工作的方式,但事实并非如此: NSClickGestureRecognizerbuttonMask = 0x1buttonMask = 0x2

func applicationDidFinishLaunching(aNotification: NSNotification) {
    // Insert code here to initialize your application


    if let button = statusItem.button {

        // Add right click functionality
        let gesture = NSClickGestureRecognizer()
        gesture.buttonMask = 0x2 // right mouse
        gesture.target = self
        gesture.action = "rightClickAction:"
        button.addGestureRecognizer(gesture)


    }}

func rightClickAction(sender: NSGestureRecognizer) {
    if let button = sender.view as? NSButton {
        NSLog("rightClick")
    }
}

更新:

我仍然没有设法开始工作。不知何故,它不会对右键单击做出反应(但在左键单击时更改代码)会。我想一些非常简单的问题正在发生,似乎阻止它工作。更奇怪的是gesture.buttonMask = 0x1左键单击。

4

1 回答 1

2

另一种解决方案NSClickGestureRecognizer是将自定义视图附加到状态栏并从那里处理事件。

小缺点是您必须注意绘图和菜单委托方法。

这里有一个简单的例子:

创建一个文件StatusItemView的子类NSView

import Cocoa

class StatusItemView: NSView, NSMenuDelegate {

  //MARK: - Variables

  weak var statusItem : NSStatusItem!
  var menuVisible = false

  var image : NSImage! {
    didSet {
      if image != nil {
        statusItem.length = image.size.width
        needsDisplay = true
      }
    }
  }

  //MARK: - Override functions

  override func mouseDown(theEvent: NSEvent) {
    if let hasMenu = menu {
      hasMenu.delegate = self
      statusItem.popUpStatusItemMenu(hasMenu)
      needsDisplay = true
    }
  }

  override func rightMouseDown(theEvent: NSEvent) {
    Swift.print(theEvent)
  }

  //MARK: - NSMenuDelegate

  func menuWillOpen(menu: NSMenu) {
    menuVisible = true
    needsDisplay = true
  }

  func menuDidClose(menu: NSMenu) {
    menuVisible = false
    menu.delegate = nil
    needsDisplay = true
  }

  //MARK: - DrawRect

  override func drawRect(dirtyRect: NSRect) {
    statusItem.drawStatusBarBackgroundInRect(bounds, withHighlight:menuVisible)
    let origin = NSMakePoint(2.0, 3.0) // adjust origin if necessary
    image?.drawAtPoint(origin, fromRect: dirtyRect, operation: .CompositeSourceOver, fraction: 1.0)
  }
}

AppDelegate您需要对自定义菜单的引用和实例的实例NSStatusItem变量

 @IBOutlet weak var menu : NSMenu!
 var statusItem : NSStatusItem!

applicationDidFinishLaunching创建视图并将其附加到状态项。请注意在附加视图后设置视图的图像以确保考虑宽度。

  func applicationDidFinishLaunching(aNotification: NSNotification) {
    statusItem = NSStatusBar.systemStatusBar().statusItemWithLength(-1) // NSVariableStatusItemLength)
    let statusItemView = StatusItemView(frame: NSRect(x: 0.0, y: 0.0, width: statusItem.length, height: 22.0))
    statusItemView.statusItem = statusItem;
    statusItemView.menu = menu
    statusItem.view = statusItemView
    statusItemView.image = NSImage(named: NSImageNameStatusAvailable)
  }

未实现特殊情况控制点击触发右键功能。

于 2015-09-06T10:01:19.843 回答