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];
}
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.
}
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
}
}
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".
let yourTapEvent = UITapGestureRecognizer(target: self, action: #selector(yourController.yourFunction))
yourObject.addGestureRecognizer(yourTapEvent) // adding the gesture to your object
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.
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
}
}
}
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
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.
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
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];
}
Si vous ajoutez différents UIGestureRecognizer
sur différents UIView
s 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.
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
}