objective-c - 检测鼠标右键单击 cocoa

标签 objective-c macos cocoa mouseevent

我试图在我的 Sprite-kit 游戏原型(prototype)中管理鼠标事件。

我使用了问题 SO_q 中的以下方法

- (void) mouseDown: (NSEvent*) theEvent
{
    NSLog(@"Click!");
}

- (void) rightMouseDown:(NSEvent*) theEvent
{
    NSLog(@"DERECHA PULSADA!");
}

但是检测正确点击的方法对我不起作用。我想检测鼠标右键单击的点击和下降。 我如何检测鼠标点击何时放下?

更新:

我尝试了以下方法,从 Cocoa Event Handling Doc 中获取.

- (void)mouseDown:(NSEvent *)theEvent 
{
        switch ([theEvent type])
        {
            case NSLeftMouseDown:
                NSLog(@"ISQUIERDO down!");
                break;
            case NSLeftMouseUp:
                NSLog(@"IZQDO soltado!");
                break;
            case RightMouseDown:
                NSLog(@"DERECHO PUSSSHHH!");
                break;
            case NSRightMouseUp:
                NSLog(@"Botón Derecho Soltado!");
                break;
            default:
                /* Ignore any other kind of event. */
                break;
        }

    return;
}

结果:只处理了左键单击的事件。

阅读 Cocoa Event Handling Doc 之后我尝试覆盖以下方法:

-(void)rightMouseDown:(NSEvent *)theEvent
{
    NSLog(@"DERECHO PUSSSHHH!");
}

- (void)rightMouseUp:(NSEvent *)theEvent
{
    NSLog(@"Botón Derecho Soltado!");
}

也没用。

更新:

就像我之前说的,这些方法在 Sprite-Kit 类中。这里是定义这些方法的类定义。

#import <SpriteKit/SpriteKit.h>

@interface OpcionesMenu : SKScene

@end

最佳答案

如果您查看 Apple 的 NSView 文档您会看到 NSView 的 rightMouseDown 实现:不会将鼠标右键事件向上发送到响应链,而是通过调用 menuForEvent: 直接处理事件。

SKView 是 NSView 的子类,所以我通过向 SKView 添加类别并实现我自己版本的 rightMouseDown: 解决了这个问题。我的 rightMouseDown: 版本仅调用 rightMouseDown: 的场景实现,这是我在场景中实际执行操作的地方。 SKView 有一个属性,scene,它持有对当前呈现场景的引用。因此,我的 rightMouseDown: 类别实现如下所示:

ObjC:

@implementation SKView (Right_Mouse)
-(void)rightMouseDown:(NSEvent *)theEvent {
     [self.scene rightMouseDown:theEvent];
}
@end

我在我的 blog 上详细说明了这一点如果你有兴趣。

Swift 3 + iOS10:

extension SKView {
  open override func rightMouseDown(with theEvent: NSEvent) {
    self.scene?.rightMouseDown(with: theEvent)
  }
}

swift :

extension SKView {
    public override func rightMouseDown(theEvent: NSEvent) {  
        self.scene?.rightMouseDown(theEvent)
    } 
}

并将其添加到您的SKScene 子类

override func rightMouseDown(theEvent: NSEvent) {
    let location = theEvent.locationInNode(self)
    ...
}

关于objective-c - 检测鼠标右键单击 cocoa ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20856059/

相关文章:

iphone - 如何将 Sprite 显示为启动画面 5 秒钟?

iphone - drawRect 没有被 UIImageView 调用

node.js - 使用获取 MongoError 的 Node 连接到 mongo 容器

macos - 生成文件时 wicked-pdf 挂起服务器

objective-c - sortedArrayUsingSelector 它在做什么?

ios - 如何获取 heightForRowAtIndexPath 中的单元格?

macos - 更改 Aquamacs 中的字体?

C++ 后端,Objective C 前端,NULL nil 问题

ios - NSDecimalNumber 返回错误的 uint64_t 值

swift cocoa : Change NSScrollView frame size with animation