Comment “transférer” le premier répondant d'un UIView à un autre?
-
07-07-2019 - |
Question
J'ai une sous-classe UIView ( CustomView
pour les besoins de cette question) qui gère elle-même tous les événements touch
(Début, Déplacé, Terminé, Annulé). J'ai aussi un UIButton
qui est un frère de CustomView
qui le chevauche.
Par exemple, ma hiérarchie de vues se présente comme suit:
- UIView (vue du contrôleur)
- CustomView avec cadre (0, 0, 300, 300)
- UIButton avec cadre (0, 0, 100, 50)
J'aimerais que CustomView capture les événements tactiles une fois que l'utilisateur a fait glisser le curseur hors du bouton UIB. Lors de la journalisation du débogage, il apparaît que l'événement UIControlEventTouchDragExit
est celui à intercepter (bien qu'il ne se déclenche que lorsque le contact est à environ 100 pixels du bouton, mais ce n'est pas important pour cette question) .
Idéalement, lorsque l'événement de fin de glisser est déclenché, le bouton cesse de recevoir des événements de déplacement tactile, le CustomView génère un événement touchesBegan
(même si je dois en simuler un moi-même), et tous les événements tactiles futurs ( touchesMoved
, etc.) seront envoyés à CustomView.
J'ai essayé ce qui suit et cela n'a aucun effet:
-(void)btnTouchDragExit:(id)sender
{
UIButton * btn = sender;
[btn resignFirstResponder];
[customView becomeFirstResponder];
}
Je pense que l'objet UITouch
sous-jacent (cohérent pour tous les événements tactiles) n'est pas reciblé de manière à pointer vers le CustomView. Comment puis-je obtenir l'effet souhaité?
La solution
Utilisez simplement hitTest: withEvent: pour déterminer quelle vue "devrait". recevoir l'événement, puis le transférer à la vue appropriée. Vous devrez peut-être danser un peu pour intercepter les événements avant qu’ils ne se rendent au bouton, mais c’est pour cela que hitTest: withEvent: a été conçu.
Autres conseils
vous devez remplacer canBecomeFirstResponder
pour retourner YES sinon devenirFirstResponder
ne fait rien. Ceci est déjà fait sur UIControl
s, mais pas sur UIView
s