Mac Cocoa:如何区分NSScrollWheel事件是来自鼠标还是触控板?

时间:2012-12-10 19:17:15

标签: cocoa nsevent trackpad

在我的应用程序中,我希望滚动发生,仅使用鼠标滚轮操作而不是触控板上的两个手指动作。基本上,我试图确定是否从鼠标或触控板生成scrollWheelEvent,内部 - (void)scrollWheel:(NSEvent *)theEvent方法。据我所知,到目前为止,似乎没有直接的方法来实现这一目标。

我尝试了将boolean变量设置为true和false in - (void)beginGestureWithEvent:(NSEvent *)event;和 - (void)endGestureWithEvent:(NSEvent *)事件;但这不是一个解决方案,因为在调用endGestureWithEvent:方法之后,会多次调用scrollWheel:方法。

这是我的代码:

    $BOOL fromTrackPad = NO;

    -(void)beginGestureWithEvent:(NSEvent *)event;
    {
        fromTrackPad = YES;    
    }

    -(void) endGestureWithEvent:(NSEvent *)event;
    {
        fromTrackPad = NO;    
    }

    - (void)scrollWheel:(NSEvent *)theEvent
    {
       if(!fromTrackPad)
       {
          //then do scrolling
       }
       else 
       {
         //then don't scroll
       }
    }

我知道这不是标准的,但这是我的要求。有谁知道这样做的方法?谢谢!

4 个答案:

答案 0 :(得分:16)

-[NSEvent momentumPhase]是解决方案。因此,从触发板生成的beginGesture和endGesture事件之间的事件返回NSEventPhaseNone以外的值-[NSEvent phase],并且在endGesture事件之后生成的触控板事件返回{{1}以外的值} NSEventPhaseNone。代码如下,

-[NSEvent momentumPhase]

答案 1 :(得分:8)

您可以使用[event hasPreciseScrollingDeltas]进行区分。它被添加到OS X Lion中。它区分线滚动(鼠标滚轮)和像素滚动(触控板,魔术鼠标)事件。

答案 2 :(得分:2)

我在Swift中的回答,但对于Objective C逻辑是相同的:

override func scrollWheel(with event: NSEvent) {
  if event.subtype == .mouseEvent {
    // mouse
  } else {
    // trackpad
  }
}

答案 3 :(得分:0)

@AProgrammer给出的答案可能不可用。因为魔术鼠标生成的滚轮事件的相位值为:开始,更改和结束。 强力鼠标生成的滚轮事件对于阶段和瞬时都具有无值。 因此该方法只能将强大的鼠标与魔术鼠标和触控板区分开来。