【问题标题】:How to handle modifier keys in Cocoa menubar application如何在 Cocoa 菜单栏应用程序中处理修饰键
【发布时间】:2019-05-02 12:41:45
【问题描述】:

所以我有一个菜单栏应用程序,它在自定义视图中有一个滑块:我希望能够在拖动时按下选项键以使滑块捕捉到增量。

现在,一切正常... 除了我找不到一种方法来通知我的菜单应用程序正在按下选项键。这是我尝试过的:

  1. NSEvent.addGlobalMonitorForEvents

    • “请注意,不会为发送到您自己的应用程序的事件调用您的处理程序。”
  2. NSEvent.addLocalMonitorForEvents

    • “您的处理程序不会被嵌套事件跟踪循环所消耗的事件调用,例如控件跟踪、菜单跟踪或窗口拖动”
  3. NSApplication.shared.currentEvent

    • 这不起作用,因为应用程序不处理 flagsChanged 事件,因此将此值设置为另一个值(按下鼠标按钮)。
  4. flagsChanged(with event: NSEvent)

    • 这不会被调用。我已将viewController 设置为acceptFirstResponder,并辞去了视图的第一响应者的职务。另外,我将视图子类化并覆盖了flagsChanged,但没有奏效。
  5. 我尝试创建一个菜单项,该菜单项具有“s”或“p”之类的键来触发操作。但是当“动作”被触发时,菜单栏就隐藏了……

所以我试图找出当按下选项键时如何通知我。这可能吗?如果您有任何问题,我可以澄清一下。

【问题讨论】:

  • 可以在菜单动作中使用NSEvent的modifierFlags,还是真的需要通知?

标签: swift cocoa first-responder nsmenu nsmenuitem


【解决方案1】:

在自定义滑块视图的 mouseDragged 方法中,您只需检查 NSEvent 参数的 modifierFlags 以查看它是否包含选项键。

--

既然可以解释滑块是一个实际的 NSSlider,那么如果是这种情况,那么滑块的控件实际上是用 NSSliderCell 实现的,并且鼠标跟踪从视图传递到 mouseDown 内的单元格,所以NSSlider 的 mouseDragged 不会被调用,而是您必须在单元格的 trackMouse:inRect:... 方法中工作。但如果您使用的是 NSSlider,那么您可能只想使用 altIncrementValue

【讨论】:

  • 滑块实际上不是 NSSlider。事实证明,滚动我的自定义控件并不是一个好主意。子类化后,它工作得更好,我可以使用修饰键。感谢您的提示。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-07-23
  • 1970-01-01
  • 1970-01-01
  • 2011-08-25
  • 1970-01-01
  • 2013-06-05
相关资源
最近更新 更多