2

Cocoa には、ジェスチャやマウス クリックの開始状態と終了状態を検出するための便利なメソッドが多数用意されています。mouseDown:マウス クリックの場合は、メソッドを簡単にオーバーライドできますmouseUp:。ただし、マウスのスクロール イベントに対して同じことを行う方法はないようですscrollWheel:。スクロールが発生したときにアクティブになるメソッドのみが提供されます。

試してみbeginGestureWithEvent:ましたが、タッチイベントにしか反応しません。

Cocoa でマウスのスクロールの開始と終了の状態を検出する方法はありますか?

4

2 に答える 2

2

onScrollWheelDown と onScrollWheelUp を検出する最善の方法は、onDown と onUp に使用するevent.phase == MayBeginことevent.phase == Cancelledですevent.phase == Ended。これは、ジェスチャがトラックパッドから離れた場合でも機能し、MagicMouse でも機能するはずです。MagicMouse は後でテストします。

私がこの結論に至った経緯の詳細な分析については、こちらをご覧ください: http://stylekit.org/blog/2016/02/28/Scroll-wheel/

于 2016-02-28T12:39:23.827 に答える
1

私が見るように、そのような単純な解決策はありません。しかし、あなたはまだこれを行うことができます。

最も明白なのは、タイマーを使用して、ホイールが最後にスクロールした時間を確認することです。私は、この目的のために軽量の GCD タイマーを使用することを好みます (strongターゲット参照を格納している NSTimer の代わりに、ARC 対応オブジェクトも使用します)。

- (void) scrollWheel:(NSEvent *)event
{
  _lastStamp = mach_absolute_time(); // get current timestamp
  if (!_running)
  {
    if (!_timer)
      [self createTimerSource];
    if (!_running)
      dispatch_resume(_timer); 
    _running = YES;
  }
}

- (void)createTimerSource
{
  NSTimeInterval timeout = ...;
  _timer=dispatch_source_create(DISPATCH_SOURCE_TYPE_TIMER, 0, 0, _timerQueue);
  dispatch_source_set_timer(_timer, DISPATCH_TIME_NOW, timeout * NSEC_PER_SEC, 0);
  // set the event handler
  dispatch_source_set_event_handler(_timer, ^{
     uint64_t stamp = mach_absolute_time(); // current stamp
     if (stamp - _lastStamp > some_tolerance_value)
     {
       // wheel did end scroll
       if (_running)
         dispatch_source_cancel(_timer);
       _running = NO;
     }
  });
}

Dispatch Sourcesの詳細については、記事をご覧ください。

于 2015-04-06T07:16:59.223 に答える