web-dev-qa-db-fra.com

tap gesture reconnizer - quel objet a été tapé?

Je suis nouveau dans la reconnaissance de geste, alors peut-être que cette question a l'air stupide: j'attribue une reconnaissance de geste à un groupe d'UIViews. Dans la méthode, est-il possible de savoir lequel d'entre eux a été exploité d'une manière ou d'une autre ou dois-je le savoir en utilisant le point exploité à l'écran?

for (NSUInteger i=0; i<42; i++) {
        float xMultiplier=(i)%6;
        float yMultiplier= (i)/6;
        float xPos=xMultiplier*imageWidth;
        float yPos=1+UA_TOP_WHITE+UA_TOP_BAR_HEIGHT+yMultiplier*imageHeight;
        UIView *greyRect=[[UIView alloc]initWithFrame:CGRectMake(xPos, yPos, imageWidth, imageHeight)];
        [greyRect setBackgroundColor:UA_NAV_CTRL_COLOR];

        greyRect.layer.borderColor=[UA_NAV_BAR_COLOR CGColor];
        greyRect.layer.borderWidth=1.0f;
        greyRect.userInteractionEnabled=YES;
        [greyGridArray addObject:greyRect];
        [self.view addSubview:greyRect];
        NSLog(@"greyGrid: %i: %@", i, greyRect);

        //make them touchable
        UITapGestureRecognizer *letterTapRecognizer = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(highlightLetter)];
        letterTapRecognizer.numberOfTapsRequired = 1;
        [greyRect addGestureRecognizer:letterTapRecognizer];
    }
44
suMi

Définissez votre sélecteur de cible (highlightLetter:) avec un argument tel que

UITapGestureRecognizer *letterTapRecognizer = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(highlightLetter:)];

Ensuite, vous pouvez obtenir la vue par

- (void)highlightLetter:(UITapGestureRecognizer*)sender {
     UIView *view = sender.view; 
     NSLog(@"%d", view.tag);//By tag, you can find out where you had tapped. 
}
106
Mani

Sa été une année de poser cette question, mais toujours pour quelqu'un.

En déclarant la UITapGestureRecognizer sur une vue particulière, attribuez la balise à

UITapGestureRecognizer *tapRecognizer = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(gestureHandlerMethod:)];
[yourGestureEnableView addGestureRecognizer:tapRecognizer];
yourGestureEnableView.tag=2;

et dans votre gestionnaire faire comme ça

-(void)gestureHandlerMethod:(UITapGestureRecognizer*)sender {
{
    if(sender.view.tag==2) {
        //do something here
    }
}
14

Voici une mise à jour pour Swift 3 et un ajout à la réponse de Mani. Je suggérerais d'utiliser sender.view en combinaison avec le marquage de UIViews (ou d'autres éléments, selon ce que vous essayez de suivre) pour une approche un peu plus "avancée".

  1. Ajout du UITapGestureRecognizer à par exemple un UIButton (vous pouvez aussi ajouter ceci à UIViews, etc.) ou à tout un tas d'éléments dans un tableau avec une boucle for et un second tableau pour les gestes du tap.
    let yourTapEvent = UITapGestureRecognizer(target: self, action: #selector(yourController.yourFunction)) 
    yourObject.addGestureRecognizer(yourTapEvent) // adding the gesture to your object
  1. Définir la fonction dans le même testController (c'est le nom de votre contrôleur View). Nous allons utiliser tags here - les tags sont des ID int, que vous pouvez ajouter à votre UIView avec yourButton.tag = 1. Si vous avez une liste dynamique d'éléments comme un tableau, vous pouvez créer une boucle for, qui parcourt votre tableau et ajoute une balise, qui augmente progressivement.

    func yourFunction(_ sender: AnyObject) {
        let yourTag = sender.view!.tag // this is the tag of your gesture's object
        // do whatever you want from here :) e.g. if you have an array of buttons instead of just 1:
        for button in buttonsArray {
          if(button.tag == yourTag) {
            // do something with your button
          }
        }
    }
    

La raison en est que vous ne pouvez pas transmettre d’arguments supplémentaires pour votreFonction lorsque vous l’utilisez conjointement avec #selector. 

Si vous avez une structure d’interface utilisateur encore plus complexe et que vous souhaitez obtenir la balise parent de l’élément attaché à votre geste, vous pouvez utiliser let yourAdvancedTag = sender.view!.superview?.tag exemple. obtenir la balise UIView d'un bouton enfoncé à l'intérieur de cette UIView; peut être utile pour les listes de vignettes + boutons, etc.

7
tech4242

Utilisez ce code dans Swift

func tappGeastureAction(sender: AnyObject) {
    if let tap = sender as? UITapGestureRecognizer {
        let point = tap.locationInView(locatedView)
        if filterView.pointInside(point, withEvent: nil) == true {
            // write your stuff here                
        }
    }
}
4
Phani Sai

vous pouvez utiliser

 - (void)highlightLetter:(UITapGestureRecognizer*)sender {
     UIView *view = sender.view; 
     NSLog(@"%d", view.tag); 
}

la vue sera l'objet dans lequel le geste de tapotement a été reconnu

2
Bonnie

Vous pouvez également utiliser la méthode "shouldReceiveTouch" de UIGestureRecognizer

- (BOOL)gestureRecognizer:(UIGestureRecognizer *)gestureRecognizer shouldReceiveTouch:     (UITouch *)touch {
     UIView *view = touch.view; 
     NSLog(@"%d", view.tag); 
}    

N'oubliez pas de définir un délégué de votre reconnaissance de geste.

2
Fawad Masud

dans Swift c'est assez simple 

Écrivez ce code dans la fonction ViewDidLoad ()

let tap = UITapGestureRecognizer(target: self, action: #selector(tapHandler(gesture:)))
    tap.numberOfTapsRequired = 2
    tapView.addGestureRecognizer(tap)

La partie gestionnaire, cela pourrait être dans viewDidLoad ou en dehors de viewDidLoad, la pâte est mise en extension.

@objc func tapHandler(gesture: UITapGestureRecognizer) {
    currentGestureStates.text = "Double Tap"
} 

ici, je teste simplement le code en imprimant la sortie si vous voulez effectuer une action, vous pouvez faire ce que vous voulez .__ ou plus de pratique et de lecture

2
Dilip Tilonia

Vous devez modifier la création de la reconnaissance de geste pour accepter le paramètre (ajouter deux points ':')

UITapGestureRecognizer *letterTapRecognizer = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(highlightLetter:)];

Et dans votre méthode highlightLetter: vous pouvez accéder à la vue attachée à Recogniser:

-(IBAction) highlightLetter:(UITapGestureRecognizer*)recognizer
{
    UIView *view = [recognizer view];
}
1
Greg

Si vous ajoutez différents UIGestureRecognizer sur différents UIViews et souhaitez distinguer dans la méthode d'action, vous pouvez vérifier la vue de la propriété dans le paramètre sender qui vous donnera la vue de l'expéditeur.

0
ahmedalkaff
func tabGesture_Call
{
     let tapRec = UITapGestureRecognizer(target: self, action: "handleTap:")
     tapRec.delegate = self
     self.view.addGestureRecognizer(tapRec)
     //where we want to gesture like: view, label etc
}

func handleTap(sender: UITapGestureRecognizer) 
{
     NSLog("Touch..");
     //handling code
}
0
Manjeet