У нас есть приложение, которое имеет полноэкранный видеоплеер, и можно вызвать всплывающее окно (паллету), чтобы предоставить пользователям инструменты для изменения видео, есть только один вид для воспроизведения видео, и все рисование происходит там,это подкласс NSOpenGLView.Если пользователь нажимает на кнопку в палитре, а затем перемещает палитру в вид видео, мы используем mouseEntered: чтобы обновить курсор - [NSCursor set] до единицы, чтобы отразить, что пользователь рисует, но примерно через секунду после,Какао установил курсор обратно на курсор стрелки.
Я создал символическую точку останова на - [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] и mouseEntered: events на - [NSView addCursorRect: cursor:] с прямоугольником всех границ представления, но это не установило бы курсор вообще, возможно, потому чтомы используем подкласс NSOpenGLView?
Странно то, что курсор не всегда сбрасывается, если вы нажмете кнопку и сделаете паузу, а затем переместитесь с поддона, мы не получаем - [NSCursor set] сВыше стека, только если вы двигаетесь сразу, возможно, что-то связано с изменением курсора рамки окна для изменения поддона, но я нене уверен.
Я придумала хакерское решение использования mouseMoved: проверить курсор - это то, что и должно быть, но это работает, только если пользователь перемещает курсор, и я предпочел бы понять, почему яполучить нежелательный - [NSCursor set] и исправить это вместо этого.