8

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

我尝试了在 -(void)beginGestureWithEvent:(NSEvent *)event; 内将布尔变量设置为 true 和 false 的解决方法;和 -(void)endGestureWithEvent:(NSEvent *)event; 但这不是解决方案,因为在调用 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

4 回答 4

17

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

 - (void)scrollWheel:(NSEvent *)theEvent
    {
       if(([theEvent momentumPhase] != NSEventPhaseNone) || [theEvent phase] != NSEventPhaseNone))
       {
          //theEvent is from trackpad           
       }
       else 
       {
         //theEvent is from mouse
       }
    }
于 2012-12-20T22:27:58.630 回答
8

您可以使用[event hasPreciseScrollingDeltas]来区分。它是在 OS X Lion 中添加的。它区分线滚动(鼠标滚轮)和像素滚动(触控板、魔术鼠标)事件。

于 2013-11-02T18:39:53.580 回答
3

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

override func scrollWheel(with event: NSEvent) {
  if event.subtype == .mouseEvent {
    // mouse
  } else {
    // trackpad
  }
}
于 2017-03-12T12:52:53.747 回答
0

@AProgrammer 给出的答案可能不可用。因为魔术鼠标产生的滚轮事件的相位值为:开始、改变和结束。并且由强大的鼠标生成的滚轮事件对于相位和动量相位都具有无值。所以该方法只能区分威力鼠标与魔术鼠标和触控板。

于 2016-10-18T15:24:05.743 回答