(iPhone) Comment manipuler les touches sur un UITextView?
Je suis en train de poignée touche sur un iPhone UITextView. J'ai réussi à manipuler les robinets et autres événements tactiles en créant une sous-classe de UIImageViews par exemple et la mise en œuvre de la touchesBegan méthode...cependant cela ne fonctionne pas avec le UITextView apparemment 🙁
La UITextView a l'interaction de l'utilisateur et multi-tactiles, juste pour être sûr...non pas de joie. Quelqu'un a réussi à gérer cela?
Vous devez vous connecter pour publier un commentaire.
UITextView (sous-classe de UIScrollView) comprend un grand nombre de de traitement des événements. Il gère le copier-coller et les détecteurs de données. Cela dit, il est probablement un bug qu'il ne passe pas non gérée événements sur.
Il existe une solution simple: vous pouvez la sous-classe UITextView et impement votre propre touchesEnded (et d'autres la gestion des événements de messages) dans vos propres versions, vous devez appeler
[super touchesBegan:touches withEvent:event];
à l'intérieur de chaque touche de la méthode de gestion.Si vous souhaitez gérer single/double/triple appuyez sur UITextView, vous pouvez déléguer UIGestureRecongnizer et d'ajouter des modules de reconnaissance de geste sur votre textview.
Heres sameple code (dans le viewDidLoad):
et
Espère que cela aide 😀
UITextView
a son propre geste modules de reconnaissance, spécialement il y a un (classe=UITextTapRecognizer
) qui s'occupe de robinets simples (action=oneFingerTap:
). Donc, ils sont entrés en collision et ceUITextTapRecognizer
est l'emportant sur votreUITapGestureRecognizer
. J'ai essayé de supprimer lesUITextTapRecognizer
avant d'ajouter mes propresUITapGestureRecognizer
mais laUITextView
va recréer de nouveau et mon gestionnaire n'est jamais appelée. C'est comme Apple ne veut pas que nous pour personnaliser UITextView unique appuyez sur le comportement.Meilleure solution (Sans swizzling quelque chose ou de l'utilisation Privée de l'API 😀 )
Comme expliqué ci-dessous, en ajoutant de nouvelles
UITapGestureRecognizers
pour le textview n'a pas les résultats attendus, méthodes de gestionnaire ne sont jamais appelés. C'est parce que laUITextView
a quelques appuyez geste de reconnaissance de l'installation déjà et je pense que leur délégué ne permettent pas mon geste de reconnaissance à travail correctement et l'évolution de leur délégué pourrait aboutir à de plus mauvais résultats, je crois.Heureusement, le
UITextView
a le geste de reconnaissance, je veux déjà de l'installation, le problème est qu'il change en fonction de l'état de la vue (c'est à dire: un ensemble de modules de reconnaissance de geste sont différents lors de l'entrée d'Japonaise que lors de l'entrée d'anglais et aussi lorsqu'il n'est pas en mode d'édition).J'ai résolu ce problème en substituant ces dans une sous-classe de UITextView:
En procédant de cette façon, peu importe quand le textview change son geste modules de reconnaissance, nous allons toujours attraper le robinet geste de reconnaissance que nous voulons → Donc, notre gestionnaire méthode sera appelée en conséquence 🙂
Conclusion:
Si vous souhaitez ajouter un geste modules de reconnaissance de la
UITextView
, vous avez pour vérifier l'affichage de texte ne l'a pas déjà.Vieille Réponse
Je suis venu avec cette réponse par swizzling une méthode privée parce que les réponses précédentes ont cons et qu'ils ne fonctionnent pas comme prévu. Ici, plutôt que de modifier les tapant sur le comportement de la
UITextView
, je viens d'intercepter la méthode appelée, puis d'appeler la méthode d'origine.De Plus Amples Explications
UITextView
a un tas de spécialiséUIGestureRecognizers
, chacun d'eux a untarget
et unaction
mais leurtarget
n'est pas leUITextView
lui-même, c'est un objet de la classeUITextInteractionAssistant
. (Cet assistant est un@package
ivar deUITextView
mais est à l'avant-définition est dans l'en-tête public: UITextField.h).UITextTapRecognizer
reconnaît les robinets et les appelsoneFingerTap:
sur leUITextInteractionAssistant
si on veut intercepter cet appel 🙂r = [[UISwipeGestureRecognizer alloc] init... ];
[textView addGestureRecognizer:r];
... j'espère que ça aideVous devez attribuer le UITextView instance.delegate = self (en supposant que vous voulez prendre soin, de le événements dans le même contrôleur)
Et assurez-vous de mettre en œuvre les UITextViewDelegate protocole dans l'interface... ex:
Ensuite, vous pouvez mettre en œuvre toutes les suivantes
Je suis à l'aide d'un textview comme une sous-vue de l'afficher en plus grand. J'ai besoin de l'utilisateur d'être en mesure de faire défiler le textview, mais pas de le modifier. Je veux détecter une simple pression du doigt sur le textview de superview, y compris sur le textview lui-même.
Bien sûr, j'ai couru dans le problème que le textview engloutit la touche qui commencent sur elle. La désactivation de l'interaction de l'utilisateur de corriger cela, mais ensuite, l'utilisateur ne sera pas en mesure de faire défiler le textview.
Ma solution a été de faire le textview modifiables et utiliser le textview de shouldBeginEditing délégué méthode pour détecter un robinet dans le textview. J'ai tout simplement PAS de retour, empêchant ainsi l'édition, mais maintenant je sais que le textview (et donc le superview) a été exploité. Entre cette méthode et la superview de touchesEnded méthode que j'ai ce dont j'ai besoin.
Je sais que cela ne fonctionne pas pour les gens qui veulent accéder à la réalité de touche, mais si tout ce que vous voulez faire est de détecter un robinet, cette approche fonctionne!
textViewDidChangeSelection:
mais qui est appelée lors de l'utilisation du clavier de bluetooth de trop et me donne des faux positifs.Comment faire un UIScrollView et
[scrollView addSubview: textview]
qui permet de faire défiler textview?Vous pouvez également envoyer un
Touch Down
événement. Fil de cet événement par le biais de l'Interface Builder.Puis ajouter le code de votre gestionnaire d'événement