[Obj-C] Combiner UISwipeGestureRecognizer et UIPanGestureRecognizer
Bonjour,
J'ai bien avancé sur mon projet test (qui n'utilise toujours pas l'autolayout mais que vous trouverez en pièce jointe), mais il me reste 2 points qui me bloquent.
- Actuellement le UIPanGestureRecognizer ne reconnais pas le sens du swipe (à savoir que je peut swiper vers le bas pour remonter, ce qui vous le concéderez n'est pas logique)
- J'aimerais que lors de mon swipe le bouton avec la flèche (le composant expandButton) bouge en "temps réel", à savoir que si mon doigt (ou mon curseur dans le cadre du Simulateur) à swiper de 10 px, le bouton doit avoir bougé de 10 px (en "temps réel").
Je n'ai rien vu d'intéressant / d'utile m'aidant à résoudre ces soucis.
Pouvez-vous m'aider à régler ces problèmes s'il vous plait ?
Merci d'avance
Mots clés:
Connectez-vous ou Inscrivez-vous pour répondre.
Réponses
Dans le MOOC de Jussieu sur la programmation iOS, j'avais utilisé UIPanGestureRecognizer pour détecter le sens du mouvement en temps réel. Je te donne un fragment de mon code source. Il te sera peut-être utile, même si c'est du Swift !
Merci Draken je vais essayer ça dans l'immédiat, je te tiens au courant
Ca marche effectivement à la perfection, merci à toi
Maintenant il me reste ce problème à résoudre:
- J'aimerais que lors de mon swipe le bouton avec la flèche (le composant expandButton) bouge en "temps réel", à savoir que si mon doigt (ou mon curseur dans le cadre du Simulateur) à swiper de 10 px, le bouton doit avoir bougé de 10 px (en "temps réel").
Est-ce que tu as essayé de faire quelque chose ?
Effectivement.
J'ai essayé de faire ça
Mais il s'avère que ça n'a pas le comportement attendu
Euh, velocity, c'est une vitesse (en points/secondes), pas une distance.
Il faudrait qu'au UIGestureRecognizerState, égal à UIGestureRecognizerStateBegan, tu gardes le point, et qu'ensuite, au Ended/Changed, tu regardes la distance parcourue, et agir en fonction.
Arf, et donc pour la distance ? C'est ce que j'avais fait à l'origine ?
Je ne sais pas. Je n'ai pas téléchargé ton projet.
J'avais fait ça
ça se rapproche. Mais tu es intéressée par la distance réellement ou par la hauteur ?
Car si je fais un long swipe sur la gauche, mais un peu vers le haut, tu vas expand la vue.
Uniquement par la hauteur.
Donc si je comprends bien ton raisonnement je dois modifier et mettre ça, c'est bien ça ?
sqrt(x*x), ça revient à valeurAbsolue(x), hein
Mais oui, c'est ce que je ferais je pense.
Oui je m'en suis rendu compte et j'ai modifié entre temps ^^
Ca résout bien mon 1er problème, mais le 2e est toujours la, malgré mes essais
Et tu passes en paramètre la hauteur de l'extension.
Je vais essayer ça, je te tiens au courant, merci en tout cas
Bon j'ai suivi ton conseil et ça donne cela
Malheureusement le bouton ne bouge toujours pas en temps réel, en fonction de la position du doigt / curseur
Qu'est-ce qui ne marche pas exactement ? Le "temps réel" ?
Tu as un delay de 0.2 et une durée d'animation de 1.0, donc potentiellement, l'animation ne va pas suivre en live la position du doigt, elle aura un petit délai...
Mais il n'aucune chance de bouger en temps réel dans ton source. Tu change son état à la fin du mouvement (événement UIGestureRecognizerStateEnd). Si tu veux du temps réel, il faut agir pendant le mouvement (événement UIGestureRecognizerStateChanged).
Plus que le temps réel, il s'avère qu'il ne descends pas jusque la ou il devrait descendre (à savoir expandButton.frame.origin.y + heightTobeExpanded), mais qu'il descends beaucoup moins bas (expandButton.frame.origin.y vaut 141 alors qu'il devrait être de 235)
Et si justement je change sa position dans le Changed, dans le End, je change juste l'image
C'est peut-être lié au fait que tu calcules une distance, et que tu ne t'attardes pas forcément à la position de la fin du swipe...
Bah pourtant si
maxHeight est la hauteur maximale (qui est égale à 115, une valeur claquée en dur pour l'instant).
Et en gros je lui dis : "si la distance est inférieure ou égale à 115, bouge moi la flèche"
La vache, je n'arrive même plus à lire correctement de l'Objective-C. Swift power !
Aucun problème Draken
J'ai essayé ça mais il s'avère que ça n'a pas non plus le résultat escompté (il y a effectivement un temps réel, mais le bouton part très vite en dehors des limites de l'écran)
Nouvelles conditions :
Le souci c'est qu'il s'avère que parfois mon bouton se place en 285 ou en 35.
Avez-vous une solution svp ?
Bon je pense avoir trouvé la solution à mon problème (et toujours sans utiliser l'autolayout qui est la prochaine étape).
Je vous met en PJ le projet.
Si certains prennent la peine de le télécharger et de le regarder, je prends les feedbacks et les éventuelles améliorations