¿Cómo funciona el impulso / trabajo de desplazamiento inercial con el Magic Mouse en NSScrollView?
-
13-09-2019 - |
Pregunta
Cuando se desplaza con el nuevo Magic Mouse de Apple (al menos en 10.6, no puedo confirmar cualquier anterior Mac OS) se obtiene de desplazamiento inercial como desplazarse en el iPhone (es decir, después de un movimiento del dedo para desplazarse, se no abruptamente parar, pero ralentiza su lugar poco a poco). Este comportamiento es "gratis" con todos NSScrollViews, parecería.
Hay casos excepcionales, como Tweetie para Mac (he oído Tweetie fue escrito con una vista de clase tabla personalizada que funciona similar a la forma en UITableView
funciona en el iPhone).
Mi pregunta es, ¿cómo sabe el punto de vista de desplazamiento cómo hacer esto desplazamiento inercial? Mi conjetura es el ratón [controlador] envía repetidamente eventos de desplazamiento con una magnitud de amortiguación de desplazamiento (o algo así) durante el período de desplazamiento. Pero no estoy muy seguro de cómo funciona.
Estoy teniendo algunos problemas de desplazamiento en mi clase ScrollView y estoy tratando de averiguar por qué (obviamente no tenemos el código fuente para Tweetie para ver por qué no consigue el desplazamiento propiamente dicho), pero sólo tratando para comprender mejor cómo funciona el fin de solucionar mis propios problemas.
Solución
NSScrollView no sabe nada sobre el Magic Mouse. El desplazamiento inercial se lleva a cabo por los acontecimientos de desplazamiento repetidas.
Puede reemplazar el método de -scrollWheel:
NSResponder y utilizar NSLog para ver cómo el Magic Mouse de desplazamiento difiere del trackpad y el desplazamiento tradicional.
conjuntos de desplazamiento tradicionales deltaX
y deltaY
para indicar el número de "líneas" para desplazarse.
dispositivos de desplazamiento suave (Trackpads y el Magic Mouse) utilizan deviceDeltaX
y deviceDeltaY
para indicar el número de píxeles para desplazarse.
Además, el Magic Mouse utiliza scrollPhase
para indicar cuando un desplazamiento inercial está en curso.
Tenga en cuenta que deviceDeltaX
y deviceDeltaY
son métodos privados de NSEvent.
Otros consejos
para optar por el impulso, añadir @ "NO" para la clave @ "AppleMomentumScrollSupported" en el comienzo de su aplicación a los valores predeterminados del usuario (ver el Magic Mouse Desarrollador Notas de la versión). Así que puede anularlo para Tweetie mediante la adición de esta entrada a sus valores por defecto de tweetue.
NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults];
NSDictionary *appDefaults = [NSDictionary dictionaryWithObject:@"NO" forKey:@"AppleMomentumScrollSupported"];
[defaults registerDefaults:appDefaults];
El código fuente para TUIScrollView está disponible aquí https://github.com/twitter/twui