如何处理 Cocoa 菜单栏应用程序中的修改键
How to handle modifier keys in Cocoa menubar application
所以我有一个菜单栏应用程序,在自定义视图中有一个滑块:我希望能够在拖动时按下选项键以使滑块对齐增量。
现在,一切正常... 除了我找不到单一的方法来通知我的菜单应用程序正在按下选项键。这是我尝试过的:
NSEvent.addGlobalMonitorForEvents
- "Note that your handler will not be called for events that are sent to your own application."
NSEvent.addLocalMonitorForEvents
- "Your handler will not be called for events that are consumed by nested event-tracking loops such as control tracking, menu tracking, or window dragging"
NSApplication.shared.currentEvent
- 这不起作用,因为应用程序不处理 flagsChanged 事件,因此该值设置为另一个值(按下鼠标按钮)。
flagsChanged(with event: NSEvent)
- 这不会被调用。我已将
viewController
设置为 acceptFirstResponder
并辞去了视图的第一响应者。另外,我已经对视图进行了子类化并覆盖了 flagsChanged
,但这并没有奏效。
我试过创建一个菜单项,它有一个像 "s" 或 "p" 这样的键来触发一个动作。但是当 "action" 被触发时,菜单栏隐藏...
所以我正在尝试寻找在按下选项键时如何通知我。这可能吗?如果您有任何问题,我可以澄清。
在自定义滑块视图的 mouseDragged
方法中,您只需检查 NSEvent 参数的 modifierFlags
以查看它是否包含选项键。
--
由于可以将滑块解释为实际的 NSSlider,如果是这种情况,则滑块的控件实际上是在 NSSliderCell 中实现的,并且鼠标跟踪从视图传递到 mouseDown 中的单元格,所以 NSSlider 的 mouseDragged 不会被调用,相反你必须在单元格的 trackMouse:inRect:...
方法中工作。但是如果你使用的是 NSSlider,那么你可能只想使用 altIncrementValue
.
所以我有一个菜单栏应用程序,在自定义视图中有一个滑块:我希望能够在拖动时按下选项键以使滑块对齐增量。
现在,一切正常... 除了我找不到单一的方法来通知我的菜单应用程序正在按下选项键。这是我尝试过的:
NSEvent.addGlobalMonitorForEvents
- "Note that your handler will not be called for events that are sent to your own application."
NSEvent.addLocalMonitorForEvents
- "Your handler will not be called for events that are consumed by nested event-tracking loops such as control tracking, menu tracking, or window dragging"
NSApplication.shared.currentEvent
- 这不起作用,因为应用程序不处理 flagsChanged 事件,因此该值设置为另一个值(按下鼠标按钮)。
flagsChanged(with event: NSEvent)
- 这不会被调用。我已将
viewController
设置为acceptFirstResponder
并辞去了视图的第一响应者。另外,我已经对视图进行了子类化并覆盖了flagsChanged
,但这并没有奏效。
- 这不会被调用。我已将
我试过创建一个菜单项,它有一个像 "s" 或 "p" 这样的键来触发一个动作。但是当 "action" 被触发时,菜单栏隐藏...
所以我正在尝试寻找在按下选项键时如何通知我。这可能吗?如果您有任何问题,我可以澄清。
在自定义滑块视图的 mouseDragged
方法中,您只需检查 NSEvent 参数的 modifierFlags
以查看它是否包含选项键。
--
由于可以将滑块解释为实际的 NSSlider,如果是这种情况,则滑块的控件实际上是在 NSSliderCell 中实现的,并且鼠标跟踪从视图传递到 mouseDown 中的单元格,所以 NSSlider 的 mouseDragged 不会被调用,相反你必须在单元格的 trackMouse:inRect:...
方法中工作。但是如果你使用的是 NSSlider,那么你可能只想使用 altIncrementValue
.