2010-10-08 10 views
6

Total Objective-C/Cocoa Touch noob ici, méfiez-vous. J'essaie d'intercepter lorsqu'un utilisateur appuie longuement sur un UITextView (une loupe apparaît alors avec le positionneur du caret) puis relâche le contact, c'est-à-dire quand normalement les options "Select" et "Select All" apparaissent, après la loupe. Je veux remplacer cela par ma propre action personnalisée qui est ensuite effectuée.Comment intercepter une pression longue sur UITextView?

Est-ce possible?

Répondre

14

Vous pouvez essayer quelque chose comme ceci:

Désactiver le haut-appui long reconnaisseur

for (UIGestureRecognizer *recognizer in textView.gestureRecognizers) { 
    if ([recognizer isKindOfClass:[UILongPressGestureRecognizer class]]){ 
    recognizer.enabled = NO; 
    } 
} 

Ensuite, ajoutez votre propre

UILongPressGestureRecognizer *myLongPressRecognizer = [[UILongPressGestureRecognizer alloc] initWithTarget:<your target> action:@selector(<your custom handler>)]; 
[textView addGestureRecognizer:myLongPressRecognizer]; 
[myLongPressRecognizer release]; 
+0

Cela semble bon ... mais est il n'y a aucun moyen pour moi de garder la loupe? Ce qui m'intéresse principalement, c'est la sortie de la presse longue APRÈS la loupe - – Epaga

+0

Hmm, je n'ai pas encore essayé ça. Vous pouvez essayer de remplacer la méthode qui gère la loupe pour ajouter votre traitement à la fin, mais c'est probablement une méthode privée, ce qui peut ne pas fonctionner correctement avec l'équipe d'évaluation d'Apple. L'autre façon est de ré-implémenter la loupe vous-même. – Altealice

+2

J'aime la pensée ici, mais malheureusement cette approche ne fonctionne pas. Peut-être une sous-vue privée enterrée à l'intérieur de UITextView qui obtient le module de reconnaissance? – BadPirate

1

Version Swift du code de @ Altealice pour désactiver la Reconnaissance longue pression intégrée:

if let actualRecognizers = self.sourcesTextView.gestureRecognizers { 
    for recognizer in actualRecognizers { 
     if recognizer.isKindOfClass(UILongPressGestureRecognizer) { 
      recognizer.enabled = false 
     } 
    } 
} 

Cette solution fonctionne, mais sachez qu'elle va désactiver les interactions textView, de sorte que les liens ne seront pas mis en surbrillance lorsqu'ils seront pressés et que le texte ne sera pas sélectionnable.

0

si vous supprimez le [LongPressgesture setMinimumPressDuration:2.0]; il fonctionnera .. puisque le geste onglet sera appelé à commencer modifier le champ de texte ... ou tout simplement mettre en œuvre ce délégué geste fonction

- (BOOL)gestureRecognizer:(UIGestureRecognizer *)gestureRecognizer shouldRecognizeSimultaneouslyWithGestureRecognizer:(UIGestureRecognizer *)otherGestureRecognizer 
{ 
    return YES; 
}