Comment l'élan / travail de défilement inertiel avec la Magic Mouse sur NSScrollView?
-
13-09-2019 - |
Question
Lorsque vous faites défiler avec la nouvelle souris Apple Magic Mouse (au moins 10.6, je ne peux pas confirmer tout précédent Mac OS), vous obtenez défilement inertiel comme le défilement sur l'iPhone (qui est, après un coup de doigt pour faire défiler, il ne pas arrêter brusquement, mais ralentit progressivement vers le bas). Ce comportement est « gratuit » avec tous NSScrollViews, il semblerait.
Il y a des cas exceptionnels, comme Tweetie pour Mac (je l'ai entendu Tweetie a été écrit avec une table personnalisée Voir classe qui fonctionne semblable à la façon dont fonctionne UITableView
sur iPhone).
Ma question est, comment les vues de défilement savoir comment faire ce défilement à inertie? Je suppose la souris [pilote] envoie à plusieurs reprises des événements de défilement avec une magnitude de défilement d'amortissement (ou quelque chose comme ça) sur la période de défilement. Mais je ne suis pas vraiment sûr de comment cela fonctionne.
Je suis quelques problèmes de défilement dans ma classe scrollview et je suis en train de comprendre pourquoi (évidemment, nous n'avons pas le code source de Tweetie pour voir pourquoi il ne reçoit pas le défilement correct), mais juste essayer pour mieux comprendre comment cela fonctionne pour corriger mes propres problèmes.
La solution
NSScrollView ne sait rien au sujet de la Magic Mouse. Le défilement à inertie est effectuée par les événements de défilement répétés.
Vous pouvez remplacer la méthode de -scrollWheel:
de NSResponder et utiliser NSLog pour voir comment le défilement Magic Mouse se distingue de trackpad et défilement traditionnel.
ensembles de défilement traditionnels deltaX
et deltaY
pour indiquer le nombre de « lignes » pour faire défiler.
Appareils de défilement lisse (et de Trackpads la Magic Mouse) utilisent deviceDeltaX
et deviceDeltaY
pour indiquer le nombre de pixels pour faire défiler.
De plus, Magic Mouse utilise scrollPhase
pour indiquer quand un défilement à inertie est en cours.
Notez que deviceDeltaX
et deviceDeltaY
sont des méthodes privées de NSEvent.
Autres conseils
de se retirer de l'élan, ajoutez @ « NO » pour la touche @ « AppleMomentumScrollSupported » au début de votre application aux paramètres utilisateur par défaut (voir Magic Mouse Developer Release Notes). Donc, vous pouvez remplacer aussi pour Tweetie en ajoutant cette entrée à vos valeurs par défaut de tweetue.
NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults];
NSDictionary *appDefaults = [NSDictionary dictionaryWithObject:@"NO" forKey:@"AppleMomentumScrollSupported"];
[defaults registerDefaults:appDefaults];
Le code source est disponible ici TUIScrollView https://github.com/twitter/twui