我覺得這是蘋果的另一個“魔法”,
但我無法檢測到非常簡單和基本的事件:當用戶停止使用滑鼠滾輪滾動時(-end- 事件)
- (void)scrollWheel:(NSEvent *)event
{
[super scrollWheel:event];
//// NSEventPhaseNone = 0, // event not associated with a phase.
//// NSEventPhaseBegan = 0x1 << 0,
//// NSEventPhaseStationary = 0x1 << 1,
//// NSEventPhaseChanged = 0x1 << 2,
//// NSEventPhaseEnded = 0x1 << 3,
//// NSEventPhaseCancelled = 0x1 << 4,
//// NSEventPhaseMayBegin = 0x1 << 5,
///
///
//event.phase -always- 0
//event.momentumPhase -always- 0
NSLog(@"event.momentumPhase = %lu, event.phase = %lu", (unsigned long)event.momentumPhase, event.phase);
if(event.phase & NSEventPhaseBegan)
{
// never called when user start scrolling with mouse wheel
NSLog(@"NSEventPhaseBegan");
}
if(event.phase & NSEventPhaseEnded)
{
// never called when user end scrolling with mouse wheel
NSLog(@"NSEventPhaseEnded");
}
}
我檢查了 NSEvent 的所有屬性,但沒有要檢查的資料。谷歌搜索以檢查其他人在做什么。沒有什么能真正解決這個問題。一些解決方案是這樣的,但是......這總是回傳 0。
uj5u.com熱心網友回復:
由具有傳統滾輪的滑鼠觸發的滾輪事件是離散處理的。沒有begin / end階段。一般來說,當NSEvent.momentumPhase為0時,則產生滾輪事件的設備很可能是傳統滑鼠。
從觸控板、Magic Mouse 或其他支持“手勢”的設備生成的滾輪事件NSEvent.momentumPhase用于報告滾動所處的階段。對于這些事件,您可以使用NSEvent.momentumPhase.
視圖可以選擇性地發布它自己的begin / end通知,這些通知與它將如何處理滾動相關,但這些通知不是NSEvent處理滾動事件機制的一部分。
根據您的用例,您最好只監聽NSView.boundsDidChangeNotification以了解視圖的視口何時發生變化,而不是嘗試覆寫所有各種滾動觸發器。
Apple 較早的 AppKit 發行說明中討論了很多內容。可悲的是,它現在似乎只是一個大檔案,但如果您四處搜索,您會看到一些部分討論如何正確處理滾輪事件以及它們多年來的演變:
AppKit 發行說明(macOS 10.12 及更早版本)
轉載請註明出處,本文鏈接:https://www.uj5u.com/qiye/521512.html
