检测鼠标右键点击可可

时间:2013-12-31 10:45:29

标签: objective-c macos cocoa mouseevent

我正在尝试在 Sprite-kit 游戏的原型中管理鼠标事件。

我使用问题SO_q

中的以下方法
- (void) mouseDown: (NSEvent*) theEvent
{
    NSLog(@"Click!");
}

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

但检测正确clic的方法对我不起作用。我想检测单击鼠标右键单击。 如何检测鼠标单击何时被删除?

更新

我尝试使用以下方法,从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

2 个答案:

答案 0 :(得分:16)

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

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

<强> ObjC:

rightMouseDown:

如果您有兴趣,我会在blog上详细说明这一点。

Swift 3 + iOS10:

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

<强>夫特:

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

并将其添加到您的extension SKView { public override func rightMouseDown(theEvent: NSEvent) { self.scene?.rightMouseDown(theEvent) } } 子类

SKScene

答案 1 :(得分:2)

extension SKView {

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

这很好用,很快,谢谢你们!