L'iPhone ajoute la physique de l'inertie / impulsion pour animer la "roue de la fortune" comme le contrôle de la rotation

J'essaie de créer un nouveau type de command rotative avec un aspect et une sensation d'une vraie roue massive soutenue sur une broche, capable de tourner autour de son point central avec un certain degré d'amortissement, qui finira par arrêter la roue . Pensez "roue de la fortune".

Exemple de commande rotative

Projet d'exemple de contrôle rotatif

Lorsque vous travaillez avec UITableView natif et / ou UIScrollView, ils peuvent être "tournés" dans une direction et continuer à défiler dans cette direction pendant un certain time. Je sais qu'un effet similaire peut être obtenu avec la courbe d'animation.

Ce qui m'intéresse est de savoir comment calculer à quel point l'élément d'interface doit défiler / tourner en fonction de la distance / vitesse que le doigt a parcourue. Différents types de "films" produiraient un comportement différent en transférant "l'élan" à la roue. Quelqu'un peut-il suggérer des exemples de tels calculs?

Je suis particulièrement intéressé par l'application du même concept d'inertie à un contrôle rotatif personnalisé comme décrit ici: Contrôle rotatif sur dépassement de stack . Les exemples actuels, et même l'application convertbot mentionnée dans les exemples n'utilisent pas l'inertie. La roue suit simplement le doigt et s'enclenche à des positions prédéfinies. Je veux faire croire à une roue similaire qu'elle a une masse réelle, donc elle peut être lancée et tournera de manière prévisible jusqu'à ce qu'elle s'arrête. (Pensez à des spectacles de type «roue de la fortune»).

Comment puis-je get ce type de comportement basé sur l'inertie de la «roue de la fortune» pour un contrôle rotatif qui donnerait l'printing que le contrôle a une masse réelle?

Je vous remercie!

Implémenter un effet de masse totalement réalist n'est pas si sortingvial, et peut-être nécessite trop de travail (surtout pour une tâche si simple), donc j'ignorerais les lois de la physique (sauf celles ssortingctement nécessaires) et simplifierais tout.

Une impulsion est rx Fr est le rayon et F est la force appliquée. Comme cela dépend du rayon, plus vous vous éloignez du centre de votre roue, plus grand sera l'élan. Ignorons-le et supposons que la force est tangente et est toujours appliquée à r = wheelWidth / 2 .

En outre, au lieu de calculer la force, vous pouvez simplement faire en sorte que cela dépende de la vitesse du geste (plus facile que de calculer la force, car cela nécessite de la masse et de l'accélération). Ainsi, nous pouvons imaginer qu'un toucher plus rapide correspondra à un plus grand moment.

Bien sûr, le geste ne sera jamais parfaitement horizontal ou vertical, donc on peut supposer qu'à chaque fois il y a deux couples appliqués: le premier correspondant au mouvement vertical et le second à l'horizontal.

Vous pouvez get la vitesse du geste, vous pouvez simplement calculer la position initiale et finale du toucher, et split leur différence par le time écoulé.

Pour get l'effet de ralentissement, vous devez supposer que, lorsque la roue est en mouvement, il y a toujours un couple opposé . Vous pouvez le définir au moment de la compilation ou le rendre dépendant de la largeur de votre roue (de sorte que les roues plus grandes ralentissent plus vite).

Maintenant, vous avez à peu près tout ce dont vous avez besoin … bonne chance 🙂

J'ai trouvé qu'en utilisant iCarousel , il est possible de créer une roue comme le contrôle avec inertie / impulsion!