web-dev-qa-db-fra.com

Événement tactile sur UIView

Quelqu'un a-t-il un exemple de code pour détecter les contacts sur une UIView créée dynamiquement? J'ai trouvé quelques références à touchesBegan mais je ne sais pas comment l'implémenter ...

30
Andrew M

Une manière très générale d'obtenir des contacts consiste à remplacer ces méthodes dans une sous-classe UIView personnalisée:

- (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event;
- (void)touchesMoved:(NSSet *)touches withEvent:(UIEvent *)event;
- (void)touchesEnded:(NSSet *)touches withEvent:(UIEvent *)event;
- (void)touchesCancelled:(NSSet *)touches withEvent:(UIEvent *)event

Les documents officiels pour ces méthodes sont sous Répondre aux événements tactiles dans les documents de la classe UIResponder (UIView hérite de ces méthodes car c'est un sous-classe du répondeur UIR). Des documents d'introduction plus longs et plus détaillés peuvent être trouvés dans le Event Handling Guide for iOS .

Si vous souhaitez simplement détecter un tap (toucher, puis retoucher dans votre vue), il est plus facile d'ajouter un UIButton comme sous-vue de votre vue et d'ajouter votre propre méthode personnalisée comme cible/paire d'action pour ce bouton. Les boutons personnalisés sont invisibles par défaut, donc cela n'affectera pas l'apparence de votre vue.

Si vous recherchez des interactions plus avancées, il est également bon de connaître la classe UIGestureRecognizer .

82
Tyler

Créez un événement tactile avec UIAnimation sur UIView, vous pouvez gérer les contacts sur UIView n'importe où.

Code suivant: ici self.finalScore est un UIView, et cup est un UIImageView. Je manipule

l'événement tactile sur UIImageView, il présente à l'intérieur de l'UIView.

- (void) touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event {

UITouch *touch1 = [touches anyObject];
CGPoint touchLocation = [touch1 locationInView:self.finalScore];
CGRect startRect = [[[cup layer] presentationLayer] frame];
CGRectContainsPoint(startRect, touchLocation);

[UIView animateWithDuration:0.7 
                      delay:0.0 
                    options:UIViewAnimationCurveEaseOut 
                 animations:^{cup.transform = CGAffineTransformMakeScale(1.25, 0.75);} 
                 completion:^(BOOL finished) {  
                     [UIView animateWithDuration:2.0 
                                           delay:2.0 
                                         options:0
                                      animations:^{cup.alpha = 0.0;} 
                                      completion:^(BOOL finished) {
                                          [cup removeFromSuperview];
                                          cup = nil;}];                 
                 }];

}

Comme UITapGestureRecognizer est une autre façon de gérer les événements tactiles sur UIView ....

UITapGestureRecognizer *touchOnView = [[[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(releaseButAction)] autorelease];

// Set required taps and number of touches
[touchOnView setNumberOfTapsRequired:1];
[touchOnView setNumberOfTouchesRequired:1];

// Add the gesture to the view
[[self view] addGestureRecognizer:touchOnView];
16
Arunjack

Créez votre propre UIView personnalisé à partir d'une sous-classe que vous avez créée en héritant UIView et remplacez la méthode suivante dans la sous-classe,

(void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event{

}
5
ThE uSeFuL

Avec le recongniseur d'invité, il est beaucoup plus facile d'attraper des événements tactiles.

Trouvez un invité de la bibliothèque de composants dans le storyboard:

enter image description here

Par exemple, faites glisser Tap Gesture Recognizer vers votre vue. Il n'est pas affiché dans l'interface utilisateur de la vue. Vous pouvez le trouver à partir du plan du document dans le panneau de gauche dans Storyboard:

enter image description here

La dernière étape consiste à le lier (par contrôle-glisser) à la vue en tant que délégué où le toucher est surveillé, et à faire glisser-déplacer vers votre classe de contrôleur de vue en tant qu'action. Voici l'image des connexions de liens.

enter image description here

et code d'action:

@IBAction func tapAction(_ sender: Any) {
    // touch is captured here.
}
3
David.Chu.ca

Au lieu de capturer le toucher en utilisant le geste, je suggérerais de changer la classe parent UIView en UIControl, afin qu'il puisse gérer l'événement touchUpInside

De:

@interface MyView : UIView

À:

@interface MyView : UIControl

puis ajoutez cette ligne pour afficher

    [self addTarget:self action:@selector(viewTapped:) forControlEvents:UIControlEventTouchUpInside]; 

Parce que le geste peut créer un problème lors du défilement.

2
Zoeb S

Ma méthode consiste simplement à changer la classe UIView en UIControl dans InterfaceBuilder IdentityInspector, puis ConnectionsInspector aura instantanément l'événement tactile prêt à être accroché.

zéro changement de code.

1
DazChong