cocoa - NSButton 鼠标按下事件

标签 cocoa appkit nsevent

我试图在鼠标按下按钮时显示弹出菜单。当鼠标按下时,按钮应显示为按下状态,而当鼠标松开时,按钮应显示为“未按下”,无论选择了任何菜单项。类似于“Expose/Space Preference”面板中用于添加应用程序的“+”按钮。

到目前为止我尝试了3种方法:

  1. 单击按钮时发送操作。但这里弹出菜单出现在鼠标向上而不是鼠标向下时

  2. 子类化 NSButton 并覆盖 mouseDown:。鼠标按下时会出现弹出菜单,我可以选择任何菜单项。但是当弹出菜单消失时,按钮似乎被按下了。因此,我需要再次单击“取消按下”按钮,然后才能再次执行相同的操作。

  3. NSEvent addLocalMonitorForEventsMatchingMask。与 2 类似的行为。

有什么建议吗?我想方法2或3是正确的方法,只需“取消按下”鼠标上的按钮即可。

最佳答案

相当古老的线程。但这是我最近面临的问题,所以如果允许我做出贡献......

就我而言,使用 NSPopupButton 不是一个选择。因为 NSPopupButton 创建了它自己的 NSMenu,我不需要它(而且我不知道如何让它消失)。

我找到了另一种方法。可以在不创建子类的情况下更改默认的 NSButton 行为。只需使用 NSControl 类的 -sendActionOn: 方法(在 -awakeFromNib 中的某个位置):

[_myButton sendActionOn:NSEventMaskLeftMouseDown];

现在,按钮的操作将在 mouseDown 事件上发送。 希望这会有所帮助。

关于cocoa - NSButton 鼠标按下事件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3651767/

相关文章:

python-3.x - Python 3 没有名为 AppKit 的模块

swift - 同时移动所有矩形的点

cocoa - 如何将滚动事件传递给父 NSScrollView

cocoa - NSAttributedString/NSTextTab 对齐问题

cocoa - 处理 cocoa 中的菜单事件

objective-c - 返回大值的 NSUserAppleScriptTask 从不调用completionHandler

objective-c - NSTableView:创建 "Overlapping"行

swift - NSTextList 格式

objective-c - NSWindow setAspectRatio 是否包括顶部栏的大小?

swift - 在 'addLocalMonitorForEventsMatchingMask' 中将 NSEventMask 管道连接在一起