Fulltitude de UIPanGestureRecognizer
busterTheo
Membre
Bonjour,
si on a plein de UIPanGestureRecognizer , essaie-t-on de n'en faire qu'un avec un switch/case of sur le UIPanGestureRecognizer reçu, n question, ou y-a-t-il une technique plus intelligente et plus compliquée, genre un petite classe qui va bien ?
J'ai fait plein d'essais, et je m'embrouille tout seul.
Merci d'avance
Mots clés:
Connectez-vous ou Inscrivez-vous pour répondre.
Réponses
Par ex sur cette vidéo, j'en ai 4, mais je vais en avoir des dizaines (points de courbes et de tangentes)
Je me disais aussi qu'avec un switch, ce serait pareil. Autant de case of que de panGestureRecognizer.
Je travaille sur un tableau des points, actuellement
par contre, comment transmettre un paramètre supplémentaire (le point - tablo ), dans l'action ?
pour n'avoir qu'une fonction
qui s'appliquera au point reçu
Hello,
Il faudra que tu crées des structures/classes pour modéliser tes données ( les curves) et enduites tu passera en paramètres cette structure/classe pour ta fonction générique.
- Chaque point bleu est une UIView, et chacune de ces view a son propre UIPanGestureRecognizer ?
- Ou tu as une seule grande vue (celle au fond jaune) dans laquelle tu dessines tout (tes poignées bleues et ta courbe) dans un seul drawRect ? (mais dans ce cas pourquoi avoir plusieurs UIPanGestureRecognizer sur la même vue ?)
- Ou encore chaque point bleu est un CAShapeLayer, ainsi que la courbe rouge elle-même, et tous ces CALayer sont ajoutés à une unique vue ?
Dans tous les cas si c'est une seule UIView c'est plus logique d'avoir un seul UIPanGestureRecognizer (avoir plusieurs PanGestureRecognizer sur la même vue c'est pas forcément une bonne idée.
Mais si c'est le premier cas, avec plusieurs vues et chacune n'ayant qu'un PanGR , alors je comprend mieux la question et on peut alors effectivement débattre
Chaque point bleu est une instance de de la classe (UIView) Point qui a son drawrect (ovalInRect)
et j'ai mis pour l'instant un UIPanGestureRecognizer sur chacun des 4 points bleus.
Le travail de détecter quelle vue est sous le point tapé est déjà fait quand le PanGR est associé à la UIView donc c'est dommage de le faire soi-même.
Moi je ferrais un UIPanGR par UIView, comme c'est le cas, et mettrais le UIViewController en delegate de tous. Et ensuite je regarderais quel est le tapGR.view et pourrais donc en déduire quel est le point qui a été tapé. Comme ça ça fait le boulot de détection de "quelle vue est tapée" pour toi.
Ouais, je suis partant pour un UIPanGR sur chaque UIView, mais j'ai pas trop compris
Autrement dit que chaque UIPanGR appelle la même méthode de target/action. Tu n'auras donc qu'une seule méthode "-(void)handleTap:(UIPanGestureRecognizer*)panGR", certainement implémentée dans ton UIViewController parent contenant tout ce beau monde (ta vue jaune et tes vues bleues et tout), et tous tes UIPanGR appelleront cette même méthode.
C'est ce que je vais faire.
Mais comment envoyer le paramètre de la UIView qui reçoit le GestureRecognizer, dans l'action ?
Pour détecter quelle view (quel point bleu) je fais bouger.
Je me suis rendu compte de ça.
Voilà ce que j'ai lorsque je fais un println(pan) :
Mais comment faire le test ?
J'ai tout essayé :
Ou
Ou
Avec plus haut
Point : La classe UIView qui fait des points.
pointStart, l'instance - Un point bleu
J'ai parcouru avec plaisir ce post, et ça m'a permis de mieux préciser ma question.
En fait, la difficulté réside dans le fait que chaque (func pointStartPan(recognizer: UIPanGestureRecognizer)), fait des choses différentes. Par ex, si je déplace un point (bleu) de simulation de point de contrôle, je dois aussi modifier le point de contrôle associé sur la courbe. Et pour chaque point (bleu), c'est différent.
Je dois donc pouvoir faire un test sur la UIView tapped, et donc pouvoir l'identifier.
Je suis étonné que le compilateur Swift ne t'aie pas gueulé dessus, ca n'a pas de sens ce sont deux types qui n'ont rien a voir... comprends-tu ce que tu fais quand tu écris ce genre de code ?!
Désolé d'avoir l'air neuhneuh, mais je suis ma piste. C'est pas toujours facile de bien communiquer - En gros je veux le nom de la view tapped.
Mais finalement, tout ça, c'est juste pour éviter, en fait, d'avoir 4 "func[/size] unPoint(recognizer: [/size]UIPanGestureRecognizer[/size])[/size]", et je me rend compte que c'est débile. En fait, je suis en train de me rendre compte que ma forme complète devrait être faite à partir d'une classe qui englobe les courbes et les points (eux aussi des classes UIView), et les 4 gestureRecognizer pour chaque forme, mais le problème est que , ces courbes et ces points ne peuvent pas être dans la même view, pour permettre aux points de s'afficher en dehors du masque, et pour permettre l'opération de masking sur seulement une partie de la forme complète.
Donc une ou quatre function de GestureRecognizer, c'est plus le sujet, ce serait plutôt de monter une classe de forme complète avec ce problème de masque et de points en dehors du masque. Je crois que je ne peux pas faire une classe de cette forme.
Voici une vidéo
C'est une forme, mais j'aurais ensuite en gros 8 à 10 formes
Bon, j'ai monté une classe Dent qui implémente les classes Curve et Point
Et je met deux Dents dans la self.view
vidéo
ça marche pas mal, à part les bugs
J'ai deux dents, et les gestureRecognizer et les UIScrollView se chevauchent, et certaines poignées ne sont plus accessibles.
Voici le code
ViewController
Et Dent, qui fait Curve et Point (qui font les drawRect), et qui gère (Dent) les gestureRecognizer
Très mauvaise idée de faire une vue qui est aussi délégué d'une UIScrollView. Trop de répétition de code. >:(
Ah mince,
comment je fais pour mettre une UIScrollView dans chaque UIView ?