スクロール ジェスチャ (トラックパッドの 2 本の指) を検出したい。どうすればいいですか?
3 に答える
scrollWheel:
ビューのメソッドをオーバーライドしたいようです。とメソッドを使用して、ユーザーがスクロールした量を取得できますNSEvent
。deltaX
deltaY
コード:
@implementation MyView
- (void)scrollWheel:(NSEvent *)theEvent {
NSLog(@"user scrolled %f horizontally and %f vertically", [theEvent deltaX], [theEvent deltaY]);
}
@end
また、Handling Trackpad Events Guideも参照してください。これは、標準のジェスチャに加えて、カスタム ジェスチャをキャプチャする方法を示します。
NSView
カスタム サブクラスにタッチ イベント メソッドを実装することで、これを行う必要があります。これらの方法は次のとおりです。
- (void)touchesBeganWithEvent:(NSEvent *)event;
- (void)touchesMovedWithEvent:(NSEvent *)event;
- (void)touchesEndedWithEvent:(NSEvent *)event;
- (void)touchesCancelledWithEvent:(NSEvent *)event;
パラメータとして渡されるNSEvent
オブジェクトには、含まれるタッチに関する情報が含まれています。特に、次を使用してそれらを取得できます。
-(NSSet *)touchesMatchingPhase:(NSTouchPhase)phase inView:(NSView *)view;
また、カスタム ビュー サブクラスでは、最初に次のように設定する必要があります。
[self setAcceptsTouchEvents:YES];
そのようなイベントを受け取るために。
scrollWheel イベントを検出するには、 - (void)scrollWheel:(NSEvent *)theEvent メソッドを使用します。
- (void)scrollWheel:(NSEvent *)theEvent
{
//implement what you want
}
上記のメソッドは、マウスのスクロール ホイールまたはトラックパッドの 2 本指ジェスチャを使用してスクロールすると呼び出されます。
scrollWheel イベントがマウスまたはトラックパッドによって生成されているかどうかを判断することが質問である場合、Apple のドキュメントによると、これは不可能です。ここに回避策がありますが、
- (void)scrollWheel:(NSEvent *)theEvent
{
if([theEvent phase])
{
// theEvent is generated by trackpad
}
else
{
// theEvent is generated by mouse
}
}
-(void)beginGestureWithEvent:(NSEvent *)event;
とを使用することもできます-(void)endGestureWithEvent:(NSEvent *)event
。これらのメソッドは、それぞれの前後に呼び出され-(void)scrollWheel:(NSEvent *)theEvent
ます。
これが機能しない場合があります - 2 本指のジェスチャをより速く使用し、トラックパッドからかなり速く指を離すと、ここで問題が発生する可能性があります - (メモリが解放されない)