2010-11-09 10 views
30

Quelqu'un a-t-il un code d'échantillon pour détecter des contacts sur un UIView créé dynamiquement? J'ai trouvé quelques références à touchesBegan mais ne peut pas comprendre comment la mettre en œuvre ...Touch Event sur UIView

Répondre

80

une façon très générale pour obtenir des touches est de 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 de ces méthodes est sous Répondre Touch Ev ents dans the UIResponder class docs (UIView hérite de ces méthodes puisqu'il s'agit d'une sous-classe de UIResponder). Documents plus longs et plus introductifs peuvent être trouvés dans le Event Handling Guide for iOS. Si vous voulez juste 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/action paire pour ce bouton. Les boutons personnalisés sont invisibles par défaut, cela n'affecterait donc pas l'aspect de votre vue.

Si vous cherchez des interactions plus avancées, il est également bon de savoir the UIGestureRecognizer class.

4

créer votre propre UIView à partir d'une sous-classe créée en héritant UIView et remplacer la méthode suivante dans la sous-classe,

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

} 
16

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

Code suivant: ici self.finalScore est un UIView, et cup est un UIImageView. Je gère

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]; 
+0

le second code snipped m'a aidé, mais une meilleure pratique serait 'UITapGestureRecognizer * touchOnView = [[[UITapGestureRecognizer alloc] initWithTarget: auto l'action: @selector (releaseButAction :)] autorelease]; 'et la méthode serait alors' - (void) releaseButAction: (UIGestureRecognizer *) gestureRecognizer' .. juste fyi! – sixstatesaway

1

Au lieu de capturer tactile à l'aide geste, je vous suggère de changer de classe mère UIView à UIControl, de sorte que il peut gérer l'événement touchUpInside

De:

@interface MyView : UIView 

A:

@interface MyView : UIControl 

puis ajoutez cette ligne pour vue-

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

Parce que le geste peut créer des problèmes lors du défilement.

2

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 pour le hook.

aucun changement de code.

3

Avec Recongnizer guesture, il est très facile d'attraper des événements tactiles.

Trouver une guested de bibliothèque de composants en story-board:

enter image description here

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

enter image description here

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

enter image description here

et le code d'action:

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