2012-12-10 6 views
7

私のアプリケーションでは、マウスからのスクロールホイールアクションのみで、トラックパッド上の2本の指ジェスチャーではなく、スクロールを実行します。基本的には、scrollWheelEventがマウスまたはトラックパッドから生成されているかどうかを判断しようとしています。 - (void)scrollWheel:(NSEvent *)theEventメソッド。今まで私が知っていることから、これを達成するための直接的な方法はないようです。Mac Cocoa:NSScrollWheelイベントがマウスまたはトラックパッドのものかどうかを区別する方法は?

ブール変数をtrueとfalseに設定することを回避しようとしました。 - (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 
     } 
    } 

が、これは私の要件です:

は、ここに私のコードです。誰もこれを行う方法を知っていますか?ありがとう!

+0

これは、はるかに低いレベルで何かのように聞こえます。ユーザーがトラックパッドとマウスで同時にスクロールするとどうなりますか? – TheAmateurProgrammer

+0

こんにちはTheAmateurProgrammerは、私が言及したように、私が掲示した質問は標準的なものではありません。私はこの機能を実装する方法を探していて、どんなアイデアも高く評価されています。 – AProgrammer

答えて

16

-[NSEvent momentumPhase]が解決策です。したがって、beginGestureイベントとendGestureイベントの間のトラックパッドから生成されるイベントは、-[NSEvent phase]の場合はNSEventPhaseNone以外の値を返し、endGestureイベントの後に生成されるトラックパッドのイベントの場合は、の場合はNSEventPhaseNone以外の値を返します。コードは次のとおりです。

- (void)scrollWheel:(NSEvent *)theEvent 
    { 
     if(([theEvent momentumPhase] != NSEventPhaseNone) || [theEvent phase] != NSEventPhaseNone)) 
     { 
      //theEvent is from trackpad   
     } 
     else 
     { 
     //theEvent is from mouse 
     } 
    } 
+1

間違っている!このアプローチでは、Apple Magicマウスを使用したスクロールがトラックパッドとして検出されます。 –

+3

これは間違っていません。マジックマウスのトラッキングサーフェスは、OS X内のトラックパッドと見なされます。また、感嘆符で囲みます。 –

+0

素晴らしい作品です。ありがとう! – zpasternack

8

[event hasPreciseScrollingDeltas]を使用して区別できます。 OS X Lionに追加されました。ラインスクロール(マウスホイール)とピクセルスクロール(トラックパッド、マジックマウス)のイベントを区別します。

+0

ポイントスクロールはピクセルではありません。 – uchuugaka

+0

多分私は気難しく思っていますが、私はこの答えは@ AProgrammer'sと同じ問題だと思います。それは正確に "それが錫で言うこと"をしないので、将来壊れやすくなり、人間が解釈するのを混乱させる可能性があります。 – Charlesism

+0

答えにタイプミスがあります: 不正:[イベントhasPreciciseScrollingDeltas] 正しい:[イベントhasPreciseScrollingDeltas] –

0

@AProgrammerの回答は利用できない可能性があります。マジックマウスによって生成されるスクロールホイールイベントは、位相値が:開始、変更、終了したためです。 力強いマウスによって生成されたスクロールホイールイベントは、位相と瞬時位相の両方で値がnoneになります。 この方法では、巨大なマウスとマジックマウスとトラックパッドを区別することしかできません。

2

スウィフトで私の答えが、Objective Cのロジックでも同じです:

override func scrollWheel(with event: NSEvent) { 
    if event.subtype == .mouseEvent { 
    // mouse 
    } else { 
    // trackpad 
    } 
} 
関連する問題