Sublass de UIGestureRecognizer, limiter les mouvement
MAGE
Membre
J'ai suivi l'épisode 121 WWDC 2010 (Advanced Gesture Recognition) qui montre comment faire une subclass de UIGestureRecognizer.
J'ai deux petit soucis, que je vais séparer en deux fils différents, soucis n° 2:
J'aimerai pouvoir faire une rotation, une translation, mais pas d'homothétie et ainsi garder toujours la même taille de l'objet.
je suppose que je dois modifier quelque chose dans les x / y / z ou a / b / tx / ty, mais malgré quelques tentatives, je ne modifie jamais les bons paramètres.
J'ai aussi regardé la doc (CGAffineTransform, mais je dois dire que c'est un peu du chinois ces matrices..
Merci pour vos pistes
J'ai deux petit soucis, que je vais séparer en deux fils différents, soucis n° 2:
J'aimerai pouvoir faire une rotation, une translation, mais pas d'homothétie et ainsi garder toujours la même taille de l'objet.
je suppose que je dois modifier quelque chose dans les x / y / z ou a / b / tx / ty, mais malgré quelques tentatives, je ne modifie jamais les bons paramètres.
J'ai aussi regardé la doc (CGAffineTransform, mais je dois dire que c'est un peu du chinois ces matrices..
Merci pour vos pistes
Connectez-vous ou Inscrivez-vous pour répondre.
Réponses
Il y a deux choses à savoir:
- la multiplication de matrices n'est pas commutative: A x B n'est pas égal à B x A. Ceci implique que l'ordre dans lequel on modifie la matrice de transformation importe.
- les transformations des coordonnées se font par rapport à l'origine du repère.
Comme, par défaut, le repère a son origine dans le coin supérieur gauche, il faut:
- initialiser la matrice de transformation avec la matrice identité
- lui appliquer la translation
- lui appliquer la rotation
- lui appliquer la translation inverse
- multiplier les coordonnées par cette matrice.
Le centre de la rotation étant le point à mi chemin entre les deux doigts, il faudra utiliser ses coordonnées pour la translation.
J'aimerai tout ça, mais sans le scale
ps : je posterai bien le code, mais je ne suis pas certain d'en avoir le droit. Les WWDC sont maintenant disponibles pour tous, mais ne faut-il pas être dev tout de même pour y avoir accès ?
Avec le code, ça t'aide, Céroce ?
Calcul de l'échelle
Utilise le théorème de Pythagore pour déterminer la distance entre beginPoint1 et beginPoint2.
De même pour la ditance entre currentPoint1 et currentPoint2.
Echelle = distanceAprès/distanceAvant
Calcul de la rotation
Utilise les fonctions trigonométriques (par exemple, acos() et signe du sinus) pour déterminer l'angle entre beginPoint1 et beginPoint2.
De même entre currentPoint1 et currentPoint2.
La différence d'angle te donne la rotation à appliquer.
Calcul de la translation
Il faut faire en sorte que le point médian entre beginPoint1 et beginPoint2 arrive au point médian entre currentPoint1 et currentPoint2.
À mon avis, le plus simple est de préparer une matrice avec les deux transformations précédentes et l'appliquer au point médian.
Le décalage de coordonnées donne la translation à appliquer.
Bon, je ne garantis pas à 100%, mais voilà l'esprit. Je te conseille de faire fonctionner les trois transformations indépendamment avant de les combiner.
(Sinon, j'essayerai de combiner rotation + translation ; et ça je dois savoir faire)
J'aimerai avoir une information sur le déplacement de mon objet, mais le soucis c'est que touchesMoved n'est plus appelé.
Je suppose que que c'est un problème de delegate.
Donc comment faire pour que lorsque je déplace ma UIView, je puisse détecter aussi sa position, même avec des UIGestureRecognizer ?
Vu que j'avais implémanté panGesture, c'est là et pas dans le touchmoved qu'il fallait que je passe..