Comment ajouter un événement tactile à une UIView?
J'essaie:
UIView *headerView = [[[UIView alloc] initWithFrame:CGRectMake(0, 0, tableView.bounds.size.width, nextY)] autorelease];
[headerView addTarget:self action:@selector(myEvent:) forControlEvents:UIControlEventTouchDown];
// ERROR MESSAGE: UIView may not respond to '-addTarget:action:forControlEvents:'
Je ne veux pas créer de sous-classe et écraser
- (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event
Réponses:
Dans iOS 3.2 et supérieur, vous pouvez utiliser des reconnaisseurs de gestes. Par exemple, voici comment gérer un événement tap:
Il existe également un tas de gestes intégrés. Consultez les documents pour la gestion des événements iOS et
UIGestureRecognizer
. J'ai également un tas d'exemples de code sur github qui pourraient aider.la source
CGPoint
représente l'emplacement du robinet dans la vue d'ensemble de la vue tapée. Vous pouvez utiliser ce point pour déplacer la vue taraudée (ou une vue frère) vers l'emplacement taraudé. Ceci est plus utile dans le gestionnaire pourUIPanGestureRecognizer
faire glisser la vue sur l'écran.Reconnaisseurs de gestes
Il existe un certain nombre d'événements tactiles (ou gestes) couramment utilisés dont vous pouvez être averti lorsque vous ajoutez un identificateur de geste à votre vue. Les types de mouvements suivants sont pris en charge par défaut:
UITapGestureRecognizer
Appuyez (en touchant brièvement une ou plusieurs fois l'écran)UILongPressGestureRecognizer
Toucher long (toucher l'écran pendant longtemps)UIPanGestureRecognizer
Pan (en déplaçant votre doigt sur l'écran)UISwipeGestureRecognizer
Glisser (déplacer rapidement le doigt)UIPinchGestureRecognizer
Pincer (en rapprochant ou en écartant deux doigts - généralement pour zoomer)UIRotationGestureRecognizer
Rotation (déplacement de deux doigts dans une direction circulaire)En plus de cela, vous pouvez également créer votre propre outil de reconnaissance des gestes personnalisé.
Ajout d'un geste dans le générateur d'interface
Faites glisser un identificateur de mouvements de la bibliothèque d'objets vers votre vue.
Contrôlez le glisser depuis le geste dans le plan du document vers votre code View Controller afin de créer une sortie et une action.
Cela doit être défini par défaut, mais assurez-vous également que l'action utilisateur activée est définie sur true pour votre affichage.
Ajout d'un geste par programme
Pour ajouter un geste par programmation, vous (1) créez un identificateur de geste, (2) l'ajoutez à une vue et (3) créez une méthode qui est appelée lorsque le geste est reconnu.
Remarques
sender
paramètre est facultatif. Si vous n'avez pas besoin d'une référence au geste, vous pouvez le laisser de côté. Si vous le faites, supprimez le(sender:)
nom après la méthode d'action.handleTap
méthode était arbitraire. Nommez-le comme vous le souhaitez .action: #selector(someMethodName(sender:))
Plus d'exemples
Vous pouvez étudier les reconnaisseurs de mouvements que j'ai ajoutés à ces vues pour voir comment ils fonctionnent.
Voici le code de ce projet:
Remarques
la source
UIView
vous devez également ajouter:self.isUserInteractionEnabled = true;
Je pense que vous pouvez simplement utiliser
je veux dire headerView s'étend de UIControl.
la source
UITapGestureRecognizer
n'est pas un remplacement deUIControlEventTouchDown
. UnTap
compose généralement deUIControlEventTouchDown
etUIControlEventTouchUpInside
.UIView
n'est pas unUIControl
et n'a donc pas accès àaddTarget:action:forControlEvents:
.Swift 3 et Swift 4
Utilisation
la source
En fonction de la réponse acceptée, vous pouvez définir une macro:
Cette macro utilise ARC, donc il n'y a pas d'
release
appel.Exemple d'utilisation de macro:
la source
Vous pouvez y parvenir en ajoutant Gesture Recognizer dans votre code.
Étape 1: ViewController.m:
Étape 2: ViewController.m:
NOTE: ici yourView dans mon cas était
@property (strong, nonatomic) IBOutlet UIView *localView;
EDIT: * localView est la boîte blanche dans Main.storyboard d'en bas
la source
Dans Swift 4.2 et Xcode 10
Utilisez UITapGestureRecognizer pour ajouter un événement tactile
Si vous souhaitez utiliser SharedClass
J'ai 3 vues dans mon ViewController appelées view1, view2 et view3.
la source
Voici une version Swift:
la source
BlockTap
?Swift 3:
la source
Cela semble assez simple de nos jours. Ceci est la version Swift.
la source
Voici la tapgesture ios; Vous devez d'abord créer une action pour GestureRecognizer après avoir écrit le code ci-dessous sous l'action comme indiqué ci-dessous
la source
Une autre façon consiste à ajouter un bouton transparent à la vue
Et puis, gérez le clic:
la source
Créez un identificateur de gestes (sous-classe), qui implémentera des événements tactiles, comme
touchesBegan
. Vous pouvez ensuite l'ajouter à la vue.De cette façon, vous utiliserez la composition à la place du sous-classement (ce qui était la demande).
la source
Pourquoi n'essayez-vous pas SSEventListener ?
Vous n'avez pas besoin de créer de reconnaissance de gestes et de séparer votre logique d'une autre méthode.
SSEventListener
prend en charge la définition de blocs d'écoute sur une vue pour écouter les gestes simples, les gestes doubles et les gestes N-tap si vous le souhaitez, et les gestes de pression longue. La définition d'un écouteur de gestes à simple pression devient la suivante:[view ss_addTapViewEventListener:^(UITapGestureRecognizer *recognizer) { ... } numberOfTapsRequired:1];
la source
Objectif c:
Rapide:
La question demande:
Il ne demande pas un événement de robinet .
Plus précisément, OP souhaite mettre en œuvre
UIControlEventTouchDown
La commutation
UIView
àUIControl
est la bonne réponse ici parce queGesture Recognisers
je ne sais rien au sujet.touchDown
,.touchUpInside
,.touchUpOutside
etc.De plus, UIControl hérite d'UIView pour que vous ne perdiez aucune fonctionnalité.
Si tout ce que vous voulez est un robinet, vous pouvez utiliser le Gesture Recognizer. Mais si vous voulez un contrôle plus fin, comme cette question le demande, vous aurez besoin d'UIControl.
https://developer.apple.com/documentation/uikit/uicontrol?language=objc https://developer.apple.com/documentation/uikit/uigesturerecognizer?language=objc
la source