2015-04-01 16 views
2

可可提供了許多有用的方法來檢測開始結束手勢和鼠標點擊的狀態。對於鼠標點擊,我們可以輕鬆覆蓋mouseDown:mouseUp:方法。然而,我們似乎沒有辦法爲鼠標滾動事件做同樣的事情 - 我們只提供scrollWheel:方法,當滾動發生時,它被激活。我試過beginGestureWithEvent:,但它只響應觸摸事件。檢測可可中的滾輪事件的開始和結束狀態

有沒有辦法檢測可可中鼠標滾動的開始和結束狀態?

+0

你使用純的NSView或NSScrollView? – Astoria 2015-04-01 12:42:19

+0

這是通用的NSView。我打算將scrollView事件用於與操作視圖無關的內容,例如更改某些成員變量。 – HuaTham 2015-04-03 23:31:41

回答

1

正如我所看到的,沒有這樣一個簡單的解決方案。 但你仍然可以做到這一點。

最明顯的是使用計時器來檢查輪子上次滾動的時間。我更喜歡使用輕量級GCD定時器(它們也是支持ARC的對象,而不是存儲strong目標引用的NSTimer)。

- (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

+0

謝謝你的方法。我現在可以看到有可能做但不知道這是否是最好的答案。我讚賞你的回答。 – HuaTham 2015-04-07 09:08:29

1

我發現檢測onScrollWheelDown和onScrollWheelUp最好的辦法是使用event.phase == MayBegin爲onDown event.phase == Cancelledevent.phase == Ended爲onUp。這甚至可以在你的手勢離開觸控板並適用於MagicMouse時起作用。我會在稍後測試MagicMouse。

你可以閱讀我是如何得出這一結論這裏更深入的分析:http://stylekit.org/blog/2016/02/28/Scroll-wheel/

相關問題