我们有一个应用程序,它有一个全屏视频播放器和一个浮动窗口(托盘),可以给用户提供修改视频的工具,只有一个视频播放视图,所有的图形都出现在其中,它是一个NSOpenGLView子类。如果用户单击托盘中的按钮,然后将托盘移动到我们使用mouseEntered的视频视图:要更新光标-[NSCursor set]为一,以反映用户正在绘制,但大约一秒钟后,Cocoa将光标设置回箭头光标。
我在-[NSCursor set]上创建了一个符号断点,以查看这是从哪里来的,这是我得到的调用堆栈。
0 ??? 0x000000010cade785 0x0 + 4507690885,
1 Periscope HiDef4 0x00000001001d3f70 main + 0,
2 AppKit 0x00007fff4da7c55e __37+[NSDisplayCycle currentDisplayCycle]_block_invoke + 695,
3 QuartzCore 0x00007fff5b73b8c7 _ZN2CA11Transaction19run_commit_handlersE18CATransactionPhase + 49,
4 QuartzCore 0x00007fff5b73a389 _ZN2CA11Transaction6commitEv + 171,
5 AppKit 0x00007fff4e234a72 __65+[CATransaction(NSCATransaction) NS_setFlushesWithDisplayRefresh]_block_invoke + 283,
6 CoreFoundation 0x00007fff503ca737 __CFRUNLOOP_IS_CALLING_OUT_TO_AN_OBSERVER_CALLBACK_FUNCTION__ + 23,
7 CoreFoundation 0x00007fff503ca65f __CFRunLoopDoObservers + 511,
8 CoreFoundation 0x00007fff503ad128 __CFRunLoopRun + 1240,
9 CoreFoundation 0x00007fff503ac9b7 CFRunLoopRunSpecific + 487,
10 HIToolbox 0x00007fff4f68cd96 RunCurrentEventLoopInMode + 286,
11 HIToolbox 0x00007fff4f68cb06 ReceiveNextEventCommon + 613,
12 HIToolbox 0x00007fff4f68c884 _BlockUntilNextEventMatchingListInModeWithFilter + 64,
13 AppKit 0x00007fff4d93da73 _DPSNextEvent + 2085,
14 AppKit 0x00007fff4e0d3e34 -[NSApplication(NSEvent) _nextEventMatchingEventMask:untilDate:inMode:dequeue:] + 3044,
15 AppKit 0x00007fff4d932885 -[NSApplication run] + 764,
16 AppKit 0x00007fff4d901a72 NSApplicationMain + 804,
17 Periscope HiDef4 0x00000001001d3f92 main + 34,
18 libdyld.dylib 0x00007fff7828a015 start + 1,
19 ??? 0x0000000000000003 0x0 + 3
奇怪的是,光标并不总是重置,如果你点击按钮并暂停,然后移动托盘我们没有得到-[NSCursor set]与上面的堆栈,它只有当你直接移动,它有可能与调整窗口框光标的托盘改变,但我不确定。
我已经想出了一个使用mouseMoved的老套解决方案:检查光标是它应该是什么,但它只有在用户移动光标时才起作用,我宁愿找出为什么我得到了不想要的-[NSCursor set]并修复它。