可可提供了許多有用的方法來檢測開始和結束手勢和鼠標點擊的狀態。對於鼠標點擊,我們可以輕鬆覆蓋mouseDown:
和mouseUp:
方法。然而,我們似乎沒有辦法爲鼠標滾動事件做同樣的事情 - 我們只提供scrollWheel:
方法,當滾動發生時,它被激活。我試過beginGestureWithEvent:
,但它只響應觸摸事件。檢測可可中的滾輪事件的開始和結束狀態
有沒有辦法檢測可可中鼠標滾動的開始和結束狀態?
可可提供了許多有用的方法來檢測開始和結束手勢和鼠標點擊的狀態。對於鼠標點擊,我們可以輕鬆覆蓋mouseDown:
和mouseUp:
方法。然而,我們似乎沒有辦法爲鼠標滾動事件做同樣的事情 - 我們只提供scrollWheel:
方法,當滾動發生時,它被激活。我試過beginGestureWithEvent:
,但它只響應觸摸事件。檢測可可中的滾輪事件的開始和結束狀態
有沒有辦法檢測可可中鼠標滾動的開始和結束狀態?
正如我所看到的,沒有這樣一個簡單的解決方案。 但你仍然可以做到這一點。
最明顯的是使用計時器來檢查輪子上次滾動的時間。我更喜歡使用輕量級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。
謝謝你的方法。我現在可以看到有可能做但不知道這是否是最好的答案。我讚賞你的回答。 – HuaTham 2015-04-07 09:08:29
我發現檢測onScrollWheelDown和onScrollWheelUp最好的辦法是使用event.phase == MayBegin
爲onDown event.phase == Cancelled
和event.phase == Ended
爲onUp。這甚至可以在你的手勢離開觸控板並適用於MagicMouse時起作用。我會在稍後測試MagicMouse。
你可以閱讀我是如何得出這一結論這裏更深入的分析:http://stylekit.org/blog/2016/02/28/Scroll-wheel/
你使用純的NSView或NSScrollView? – Astoria 2015-04-01 12:42:19
這是通用的NSView。我打算將scrollView事件用於與操作視圖無關的內容,例如更改某些成員變量。 – HuaTham 2015-04-03 23:31:41