I'm new to gesture recognizers so maybe this question sounds silly: I'm assigning tap gesture recognizers to a bunch of UIViews. In the method is it possible to find out which of them was tapped somehow or do I need to find it out using the point that was tapped on screen?
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];
}
You should amend creation of the gesture recogniser to accept parameter (add colon ':')
And in your method highlightLetter: you can access the view attached to recogniser:
Typical 2019 example
Say you have a
FaceView
which is some sort of image. You're going to have many of them on screen (or, in a collection view, table, stack view or other list).In the class
FaceView
you will need a variable "index"so that each FaceView can be self-aware of "which" face it is on screen.
So you must add
var index: Int
to the class in question.So you are adding many FaceView to your screen ...
You now add a click to f
Here's the secret:
You now know "which" face was clicked in your table, screen, stack view or whatever.
It's that easy.
you can use
view will be the Object in which the tap gesture was recognised
Use this code in Swift
in swift it quite simple
Write this code in ViewDidLoad() function
The Handler Part this could be in viewDidLoad or outside the viewDidLoad, batter is put in extension
here i'm just testing the code by printing the output if you want to make an action you can do whatever you want or more practise and read
Here is an update for Swift 3 and an addition to Mani's answer. I would suggest using
sender.view
in combination with tagging UIViews (or other elements, depending on what you are trying to track) for a somewhat more "advanced" approach.Defining the function in the same testController (that's the name of your View Controller). We are going to use tags here - tags are Int IDs, which you can add to your UIView with
yourButton.tag = 1
. If you have a dynamic list of elements like an array you can make a for-loop, which iterates through your array and adds a tag, which increases incrementallyThe reason for all of this is because you cannot pass further arguments for yourFunction when using it in conjunction with #selector.
If you have an even more complex UI structure and you want to get the parent's tag of the item attached to your tap gesture you can use
let yourAdvancedTag = sender.view!.superview?.tag
e.g. getting the UIView's tag of a pressed button inside that UIView; can be useful for thumbnail+button lists etc.